Python多任务(多线程执行带有参数的任务,利用threading创建线程时传入参数--args参数和kwargs参数)
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 threadingdef 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.线程的注意点
- 线程之间执行是无序的
- 主线程会等待所有的子线程执行结束再结束
- 线程之间共享全局变量
- 线程之间共享全局变量数据出现错误问题
线程之间执行是无序的
import threading import timedef 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调度决定的
主线程会等待所有的子线程执行结束再结束
import threading import timedef 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")
运行结果: 子线程一直会执行,主线程会等待子线程结束再结束
如果要主线程不等待子线程结束再结束,可以把子线程设置为守护线程, 主线程退出后子线程直接销毁。
第一种方式: 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()
运行结果: 可以共同访问一个变量
如果想让 添加数据的子线程执行完之后再执行读取数据的代码 join()方法,线程等待,
join()方法,线程等待(线程同步的一种方式,保证同一时刻只能有一个线程去操作全局变量,同步就是按照预先的先后次序进行运行,比如现实生活中的对讲机,你说完,我再说),让第一个线程执行完之后再执行第二个线程,保证数据不会有问题
add_thread.start()add_thread.join()read_thread.start()
Python多任务(多线程执行带有参数的任务,利用threading创建线程时传入参数--args参数和kwargs参数)相关推荐
- python 的多线程执行速度
python 的多线程有点鸡肋,适用场景有局限,单位时间多个核只能跑一个线程. 有泳池一个,四个泵,但只有一个人,一人只能开启管理着其中一个,所以四个泵没什么用.但是,如果泵的工作时间与冷却恢复时间是 ...
- python 线程锁_Python3多线程执行任务含线程同步锁
Python启动多线程执行任务,用线程锁实现同步分配任务,最后等待所有线程执行完毕#python3多线程演示 import threading import random import time to ...
- spring 定时任务 多任务并行执行,多任务多线程 单任务单线程执行实现细节
前提:spring 定时任务,默认是多任务单线程执行,也就是串行执行的 当前需求: 1. 多任务多线程执行(不同的定时任务并行执行) 2.同一个定时任务单线程执行(保证一个定时任务A在执行完成前,A的 ...
- 【Python】多线程及threading模块介绍
目录 1. 多线程简单介绍 2. threading模块介绍 2.1 threading模块常用方法 2.2 Thread类使用 2.2.1 使用构造函数传递可调用对象的方法创建线程 2.2.2 继 ...
- python + wget多线程下载
python + wget多线程下载 读取链接 下载函数 MyThread 并行下载 代码 由于有个项目需要下载大量数据,数据大多是每个100MB左右,所以我想使用python + wget多线程下载 ...
- Python多任务教程
一.并发和并行 多任务:一定时间段内,充分利用cpu资源,同时去执行多个任务 并发: 快速交替的 去执行多任务 并行: 真正同时的 去执行多任务 ,就是同时进行 二.多进程 1.多进程入门 知识点: ...
- python多任务编程_python线程的多任务编程
多任务 多任务介绍 对于人来说,一边听歌,一边跳舞就是多任务. 对于电脑,简单的说,同一时间执行多个程序处理数据叫做多任务 多任务理解 单核CPU 单核cpu在处理多任务的时候是根据时间片轮转的方式进 ...
- 【script】python实现多线程将doc、docx转pdf,doc转docx
摘要 本文讲述通过python实现多线程将当前目录下的 .doc文档转.pdf..docx文档转.pdf,以及.doc文档转.docx(在python中,如需对word文档进行读写,只能读写docx格 ...
- python多任务,线程详解
python 多任务 多线程 python的thread模块是⽐较底层的模块,python的threading 模块是对thread做了⼀些包装的,可以更加⽅便的被使⽤ 调用 1 直接调用 # –*– ...
最新文章
- php 修改数据库表的字段的值
- 如何轻松将上亿的数据玩弄于股掌之中?
- 那些年踩过的Java异常,简直了!
- html文件中包含相关的d3.js文件,D3.js进阶系列之CSV表格文件的读取详解
- mysql的主从,主主,半同步
- 面试的那些事(收藏类)
- 雷林鹏分享:PHP 表单验证
- DevExpress WPF v19.1新版亮点:PDF Viewer等控件新功能
- LINUX剪贴板调用接口获取数据
- 管理感悟:产品功能比别人差,所以不能用?
- 一年级学python_Python这个黑科技,后悔没有早点学起来
- 【从零学习openCV】IOS7人脸识别实战
- Java实现的各种排序算法
- 基于jsp、ssm网上购物商城系统(带论文)
- 请问下面这段代码哪里有错? private static final String s=
- Java中的字符串及其中的常用方法
- 需要来自administrator的权限才能删除
- [总结]视频质量评价技术零基础学习方法
- 用python,重温小时候猜数字大小游戏
- 数据库 vs 数据仓库