多线程和多进程的区别_多线程 python

多线程和多进程的区别_多线程 pythontarget:指定这个线程去哪个函数里面去执行代码args:指定将来调用函数的时候传递什么数据过去args参数指定的一定是一个元组类型importthreadingimporttimeg_nums=[1,2]deftest1(temp):temp.append(33)pri……

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

1.多线程执行带有参数的任务

以元组形式传参

以字典方式进行传参       (字典的key值和参数名要一致)

2.线程的注意点

线程之间执行是无序的

主线程会等待所有的子线程执行结束再结束

如果要主线程不等待子线程结束再结束,可以把子线程设置为守护线程, 主线程退出后子线程直接销毁。

线程之间共享全局变量

如果想让  添加数据的子线程执行完之后再执行读取数据的代码  join()方法,线程等待,


1.多线程执行带有参数的任务

   Thread 类执行任务并给任务传参数有两种方式:

  • args:     指定将来调用 函数的时候   传递什么数据过去
                      args参数指定的一定是一个元组类型
  • kwargs 表示以字典方式给执行任务传参

  • 以元组形式传参

import threading
import time
g_nums = [1,2]

def test1(temp):
    temp.append(33)
    print("-----in test1 temp=%s-----"% str(temp))

def test2(temp):
    print("-----in test2 temp=%s-----"% str(temp))

def main():

    t1 = threading.Thread(target=test1,args=(g_nums,))  # 加上要传递的参数,元组类型
    t2 = threading.Thread(target=test2, args=(g_nums,))  # args 元组类型

    t1.start()
    time.sleep(1)

    t2.start()
    time.sleep(1)

    print("-----in main temp=%s-----"% str(g_nums))

if __name__ == '__main__':
    main()

结果:

 —–in test1 temp=[1, 2, 33]—–
—–in test2 temp=[1, 2, 33]—–
—–in main temp=[1, 2, 33]—–

  • 以字典方式进行传参       (字典的key值和参数名要一致)

import threading


def eat(name, number):
    print("eating :%s number :%d" % (name, number))


def watch(name, type):
    print("watch : %s type:%s" % (name, type))


if __name__ == '__main__':
    eat_thread = threading.Thread(target=eat, kwargs={"name": "爆米花", "number": 1})
    watch_thread = threading.Thread(target=watch, kwargs={"name": "电影", "type": "科幻"})

    eat_thread.start()
    watch_thread.start()


运行结果:

eating :爆米花 number :1
watch : 电影 type:科幻
 

2.线程的注意点

  1. 线程之间执行是无序的
  2. 主线程会等待所有的子线程执行结束再结束
  3. 线程之间共享全局变量
  4. 线程之间共享全局变量数据出现错误问题
  • 线程之间执行是无序的

import threading
import time

def task():
    time.sleep(0.2)
    # 获取当前线程
    print(threading.current_thread())


if __name__ == '__main__':
    for i in range(20):
        # 每循环一次创建一个子线程
        sub_thread = threading.Thread(target=task)
        # 启动子线程
        sub_thread.start()

 通过下方的运行结果可以看出,   线程之间的执行确实是无序的,具体哪个线程执行是由cpu调度决定的

多线程和多进程的区别_多线程 python

  • 主线程会等待所有的子线程执行结束再结束

import threading
import time


def task():
    while True:
        print("子线程任务执行中***")
        time.sleep(0.2)


if __name__ == '__main__':
    # 创建子线程
    sub_thread = threading.Thread(target=task)
    sub_thread.start()

    # 主线程延迟执行1秒
    time.sleep(1)
    print("主线程over")

 运行结果:  子线程一直会执行,主线程会等待子线程结束再结束

多线程和多进程的区别_多线程 python

  • 如果要主线程不等待子线程结束再结束,可以把子线程设置为守护线程, 主线程退出后子线程直接销毁。

    第一种方式:  daemon=True

    # daemon=True 表示创建的子线程守护主线程,主线程退出子线程直接销毁
    sub_thread = threading.Thread(target=task, daemon=True)

第二种方式:setDaemon(True)

    sub_thread = threading.Thread(target=task)
    sub_thread.setDaemon(True)
    sub_thread.start()
  • 线程之间共享全局变量

import threading

# 定义全局变量
g_list = []


# 添加数据
def add_data():
    for i in range(10):
        # 每循环一次就把数据添加到全局变量中
        g_list.append(i)
        print("add: ", i)


# 读取数据
def read_data():
    print("read:", g_list)


if __name__ == '__main__':
    # 创建子线程
    add_thread = threading.Thread(target=add_data)
    read_thread = threading.Thread(target=read_data)

    add_thread.start()
    read_thread.start()

运行结果:  可以共同访问一个变量

多线程和多进程的区别_多线程 python

  • 如果想让  添加数据的子线程执行完之后再执行读取数据的代码  join()方法,线程等待

  join()方法,线程等待(线程同步的一种方式,保证同一时刻只能有一个线程去操作全局变量,同步就是按照预先的先后次序进行运行,比如现实生活中的对讲机,你说完,我再说),让第一个线程执行完之后再执行第二个线程,保证数据不会有问题

    add_thread.start()
    add_thread.join()
    read_thread.start()

多线程和多进程的区别_多线程 python

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/184204.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ya系列圆振动筛_L型厨房设计好不好

    ya系列圆振动筛_L型厨房设计好不好‘资料下载链接’:https://download.csdn.net/download/dwf1354046363/21778034YAH2460型圆振动筛设计摘要目前我国各种选煤厂使用的设备中,振动筛(筛分机)是问题较多、维修量较大的设备之一。这些问题突出表现在筛箱断梁、裂帮、稀油润滑的箱式振动器漏油、齿轮打齿、轴承温升过高、噪声过大等问题,同时伴有传动带跳带、断带等故障。这类问题直接影响了振动筛(筛分机)的使用寿命,严重影响了生产。YAH—2460型圆振动筛可以很好的解决此类问题,因此本

    2022年10月2日
    2
  • linux系统带界面,linux系统界面详情介绍[通俗易懂]

    linux系统带界面,linux系统界面详情介绍[通俗易懂]Linux作为一款免费的、开源的操作系统,linux系统界面也被广大开发者根据自身的喜好和审美设计的五花八门,有些Linux系统界面被开发者制作的相当精致,具有很强的观赏性和立体感,让人叹为观止,下面我们系统的介绍一下Linux系统界面。简单地说,Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的…

    2022年5月14日
    63
  • Solr使用入门指南

    Solr使用入门指南

    2021年12月6日
    40
  • 小树311_森林小道

    小树311_森林小道原题链接森森开了一家快递公司,叫森森快递。因为公司刚刚开张,所以业务路线很简单,可以认为是一条直线上的N个城市,这些城市从左到右依次从0到(N−1)编号。由于道路限制,第i号城市(i=0,⋯,N−2)与第(i+1)号城市中间往返的运输货物重量在同一时刻不能超过C​i​​ 公斤。公司开张后很快接到了Q张订单,其中j张订单描述了某些指定的货物要从S​j​​ 号城市运输到T​j​​ 号城市。这里我们简单地假设所有货物都有无限货源,森森会不定时地挑选其中一部分货物进行运输。安全起见,这些货物不会在中

    2022年8月9日
    2
  • iframe自适应高度_iframe根据内容自适应高度

    iframe自适应高度_iframe根据内容自适应高度1、iframe自适应页面高度   首先需要给iframe设置一个id,不需要滚动条则加上scrolling=”no”   然后加上一个onload事件functioniFrameHeight(iframe){ varifm=document.getElementById(iframe.id); varsubWeb=document.frames

    2022年10月12日
    3
  • evaluateJavascript_jquery form

    evaluateJavascript_jquery formhttp://www.position-relative.net/creation/formValidator/demos/demoValidators.html      $(function(){      $(“#enrolment_Form”).validationEngine(“attach”);      va

    2022年10月3日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号