Python多线程threading join和守护线程setDeamon原理详解


Posted in Python onMarch 18, 2020

同一进程下的多个线程共享内存数据,多个线程之间没有主次关系,相互之间可以操作;cpu执行的都是线程,默认程序会开一个主线程;进程是程序以及和程序相关资源的集合;某些场景下我们可以使用多线程来达到提高程序执行效率的目的,下面就多线程的一些基础知识做简要说明

简单的多线程

import threading, time

def test1(x):
  time.sleep(5)
  print(x**x)

#下面定义两个线程调用test1这个函数,创建多线程使用如下语法,target后面跟函数名,args传递实参,实参需要以元组形式传递
start_time = time.time()
t1 = threading.Thread(target=test1, args=(5,))
t2 = threading.Thread(target=test1, args=(6,))
#启动多线程
t1.start()
t2.start()
end_time = time.time()
total_time = end_time - start_time
print("two Thread used %s time"%total_time) #由于使用多线程,t1 t2启动以后并不会等待期执行完程序才继续往后走,因为主程序就是主线程和t1 t2是并行执行的,主程序执行到此t1 t2并未运行完成

time.sleep(6)
#多线程启动数量比较多时可以使用for循环,多线程并行执行,打印的结果有可能不是按照启动顺序来打印的
for i in range(5):
  t3 = threading.Thread(target=test1, args=(i,))
  t3.start()
time.sleep(6)

主线程等待非主线程执行完毕才继续执行 join方法

#有些情况主线程需要子线程执行完毕后,有可能是将数据处理完毕后才执行接下来的主线程的东西
start_time1 = time.time()
tl = [] #将多线程的对象存起来,用于后面join方法
for i in range(5):
  t4 = threading.Thread(target=test1, args=(i,))
  t4.start()
  tl.append(t4)
for t in tl: #将多线程并发join,参加join的子线程执行完毕后才继续执行下面的主线程。
  t.join()
end_time1 = time.time()
total_time1 = end_time1 - start_time1
print(total_time1) #此次执行时间大约就是5s
#如果多个子线程一些join一些没有join主线程怎么处理???部分子线程join主线程会等join时间最长的子线程结束后才继续,未参与join的子线程仍然和主线程并行运行
t5 = threading.Thread(target=test1, args=(5,))
t6 = threading.Thread(target=test1, args=(6,))
t5.start()
t6.start()
t5_join_start_time = time.time()
t5.join()
time.sleep(10)
t5_join_end_time = time.time()
print("t5 join time is %s"%(t5_join_end_time - t5_join_start_time)) #实际耗时15s

守护线程 setDeamon

#守护进程,即主线程结束以后所有的其它线程也立即结束,不用等其它线程执行完毕;正常情况即使没加join主线程执行完毕当其它线程未执行完毕程序也不会退出,必须等待所有线程执行完毕程序才结束,类似主程序在末尾有默认的join
def test1(x):
  time.sleep(5)
  print("i an other Thread",x**x)

for i in range(5):
  t = threading.Thread(target=test1, args=(i,))
  t.setDaemon(True)
  t.start()

print("Main Thread is done") #整个程序结束,不会等待守护线程打印操作执行完毕就直接结束了

递归锁 Rlock

#递归锁,一个锁里面嵌套着锁,如果不使用递归锁会导致释放锁逻辑错误,整个程序就跑偏了;使用递归锁后程序会维护一个加锁 解锁的数据结构,保证释放锁不会出问题
lock = threading.Lock()
def test2():
  lock.acquire()
  print("this is test2")
  lock.release()

def test3():
  lock.acquire()
  print("this is test3")
  lock.release()

def test4():
  lock.acquire()
  test2()
  print("this is test4")
  test3()
  lock.release()

rlock_test = threading.Thread(target=test4)
rlock_test.start()

while threading.active_count() != 1:
  print("current thread count is",threading.active_count()) #整个程序一直在打印有两个线程,非主线程的锁嵌套出问题导致无法退出,整个程序卡死
  time.sleep(1)

将lock = threading.Lock()修改为lock = threading.RLock()整个程序就能正常结束;正常结束的输出如下

this is test2
this is test4
current thread count is 2
this is test3

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中将字典转换为XML以及相关的命名空间解析
Oct 15 Python
Python的MongoDB模块PyMongo操作方法集锦
Jan 05 Python
让python 3支持mysqldb的解决方法
Feb 14 Python
详解django的serializer序列化model几种方法
Oct 16 Python
Python3 jupyter notebook 服务器搭建过程
Nov 30 Python
使用Python开发SQLite代理服务器的方法
Dec 07 Python
Python中extend和append的区别讲解
Jan 24 Python
Python高级特性与几种函数的讲解
Mar 08 Python
Python的几种主动结束程序方式
Nov 22 Python
Python打开文件、文件读写操作、with方式、文件常用函数实例分析
Jan 07 Python
Python count函数使用方法实例解析
Mar 23 Python
解决PDF 转图片时丢文字的一种可能方式
Mar 04 Python
Python semaphore evevt生产者消费者模型原理解析
Mar 18 #Python
Python中remove漏删和索引越界问题的解决
Mar 18 #Python
Python集成开发工具Pycharm的安装和使用详解
Mar 18 #Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
Mar 18 #Python
PyTorch加载自己的数据集实例详解
Mar 18 #Python
Python进程间通信multiprocess代码实例
Mar 18 #Python
python实现超级玛丽游戏
Mar 18 #Python
You might like
FleaPHP的安全设置方法
2008/09/15 PHP
linux下使用ThinkPHP需要注意大小写导致的问题
2011/08/02 PHP
PHP遍历XML文档所有节点的方法
2015/03/12 PHP
PHP开发制作一个简单的活动日程表Calendar
2016/06/20 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
js播放wav文件(源码)
2013/04/22 Javascript
php的文件上传入门教程(实例讲解)
2014/04/10 Javascript
Javascript的&&和||的另类用法
2014/07/23 Javascript
JavaScript操作select元素和option的实例代码
2016/01/29 Javascript
利用imgareaselect辅助后台实现图片上传裁剪
2017/03/02 Javascript
Flask中获取小程序Request数据的两种方法
2017/05/12 Javascript
cocos creator Touch事件应用(触控选择多个子节点的实例)
2017/09/10 Javascript
浅谈JsonObject中的key-value数据解析排序问题
2017/12/06 Javascript
Angular学习笔记之集成三方UI框架、控件的示例
2018/03/23 Javascript
解决jQuery使用append添加的元素事件无效的问题
2018/08/30 jQuery
vue实现类似淘宝商品评价页面星级评价及上传多张图片功能
2018/10/29 Javascript
微信小程序module.exports模块化操作实例浅析
2018/12/20 Javascript
three.js搭建室内场景教程
2018/12/30 Javascript
vue接口请求加密实例
2020/08/11 Javascript
Node.js 中如何收集和解析命令行参数
2021/01/08 Javascript
Python MD5文件生成码
2009/01/12 Python
python多重继承实例
2014/10/11 Python
python shell根据ip获取主机名代码示例
2017/11/25 Python
Python+OpenCV人脸检测原理及示例详解
2020/10/19 Python
Python批量提取PDF文件中文本的脚本
2018/03/14 Python
Python设计模式之观察者模式原理与用法详解
2019/01/16 Python
对python3 sort sorted 函数的应用详解
2019/06/27 Python
python zip()函数使用方法解析
2019/10/31 Python
Python箱型图处理离群点的例子
2019/12/09 Python
Python Tornado批量上传图片并显示功能
2020/03/26 Python
Pytorch 卷积中的 Input Shape用法
2020/06/29 Python
英国奢侈皮具品牌:Aspinal of London
2018/09/02 全球购物
OSPREY LONDON官网:英国本土皮具品牌
2019/05/31 全球购物
一份创业计划书范文
2014/02/08 职场文书
工作作风承诺书
2014/08/30 职场文书
Python中的matplotlib绘制百分比堆叠柱状图,并为每一个类别设置不同的填充图案
2022/04/20 Python