多线程和多进程的区别_多线程 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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql连接远程数据库_plsql连接远程数据库

    mysql连接远程数据库_plsql连接远程数据库  新安装的MySQL只有一个root用户,默认不开启远程连接。下面以Ubuntu系统下的MySQL为例,说明如何远程连接MySQL数据库。登录root用户mysql-uroot-pyongdu查看mysql数据库中的所有表mysql>showdatabases;+——————–+|Database|+——-…

    2022年10月13日
    5
  • 关系数据库的范式理论_数据库规范化理论依据

    关系数据库的范式理论_数据库规范化理论依据文章目录求关系模式最高达到第几范式的步骤通俗理解1NF,2NF,3NF.如何求关系模式的候选码如何求闭包函数依赖求关系模式最高达到第几范式的步骤根据给定的U和F,首先求它的候选码根据候选码判断关系F中的函数关系是否满足第二范式,若不满足则为关系模式的规范化最高为第一范式然后判断是否存在非主属性传递依赖,如果存在则不满足第二范式,如果不存在则关系模式的规范化最高为第三范式.通俗理解1N…

    2022年10月16日
    3
  • jmeter并发接口测试教程_jmeter高并发测试

    jmeter并发接口测试教程_jmeter高并发测试1.下载JMeterApacheJMeter-DownloadApacheJMeter我是windows系统,选择了zip下载。2.解压下载好的zip3.打开bin文件夹找到jmeter.properties配置文件,修改(大概在39行的位置)language=zh_CN4.在bin目录下,找到jmeter.bat,双击启动5.新建测试计划,选中“测试计划”,鼠标右击,选择添加->线程(用户)->线程组6.光标选中线程组,..

    2022年9月29日
    1
  • version control

    version control

    2021年7月2日
    107
  • 很黄色的JAVA游戏_《yellow》很黄!很暴力?居然有这么黄的游戏!

    很黄色的JAVA游戏_《yellow》很黄!很暴力?居然有这么黄的游戏!原标题:《yellow》很黄!很暴力?居然有这么黄的游戏!《yellow》是一款很“黄”但是一点也不暴力的解密益智类游戏,游戏一共有50关,每一关都非常非常的黄,不适宜长时间玩耍~游戏虽好玩但是要适度哦~游戏的特色就是黄,一打开游戏游戏的界面就和游戏的名字一样,玩家要通过自己的脑洞来进行通关,通关的方法也和游戏的名字一样,只要让游戏界面全部变黄了就能通关了,游戏的解密相对其他解密游戏简直亲切,…

    2022年10月15日
    2
  • SpringBoot 介绍「建议收藏」

    SpringBoot 介绍「建议收藏」SpringBoot介绍目录1.简介2.WhySpringBoot1.简介    SpringBoot最开始基于Spring4.0设计,是由Pivotal公司提供的框架。    SpringBoot发展史:2003年RodJohnson成立Interface公司,产品是SpringFramework2004年,Spring框架开源,公司改名为SpringSource2008年,收购ApacheSer

    2022年9月22日
    2

发表回复

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

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