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自动化工具日志查询分析脚本代码实现
Nov 26 Python
跟老齐学Python之玩转字符串(3)
Sep 14 Python
Python中的作用域规则详解
Jan 30 Python
用Python中的字典来处理索引统计的方法
May 05 Python
python多任务及返回值的处理方法
Jan 22 Python
python实现学员管理系统
Feb 26 Python
用Python实现最速下降法求极值的方法
Jul 10 Python
Django的性能优化实现解析
Jul 30 Python
vscode写python时的代码错误提醒和自动格式化的方法
May 07 Python
利用OpenCV中对图像数据进行64F和8U转换的方式
Jun 03 Python
Ubuntu权限不足无法创建文件夹解决方案
Nov 14 Python
python 实现图与图之间的间距调整subplots_adjust
May 21 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
php smarty truncate UTF8乱码问题解决办法
2014/06/13 PHP
thinkphp区间查询、统计查询与SQL直接查询实例分析
2014/11/24 PHP
php实现微信发红包功能
2018/07/13 PHP
js 面向对象的技术创建高级 Web 应用程序
2010/02/25 Javascript
浅析webapp框架AngularUI的demo
2014/12/21 Javascript
jquery文字填写自动高度的实现方法
2016/11/07 Javascript
jQuery中ajax错误调试分析
2016/12/01 Javascript
vue嵌套路由与404重定向实现方法分析
2018/05/04 Javascript
在Bootstrap开发框架中使用dataTable直接录入表格行数据的方法
2018/10/25 Javascript
原生js实现二级联动菜单
2019/11/27 Javascript
微信小程序录音实现功能并上传(使用node解析接收)
2020/02/26 Javascript
JavaScript设计模式--简单工厂模式定义与应用案例详解
2020/05/23 Javascript
[01:08:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS LGD-CDEC
2014/05/22 DOTA
[52:02]完美世界DOTA2联赛PWL S2 FTD.C vs SZ 第一场 11.27
2020/11/30 DOTA
Python的批量远程管理和部署工具Fabric用法实例
2015/01/23 Python
Python构造函数及解构函数介绍
2015/02/26 Python
简单介绍Python中的RSS处理
2015/04/13 Python
详解Python中表达式i += x与i = i + x是否等价
2017/02/08 Python
浅谈python jieba分词模块的基本用法
2017/11/09 Python
Python应用库大全总结
2018/05/30 Python
python3+selenium实现126邮箱登陆并发送邮件功能
2019/01/23 Python
Python比较配置文件的方法实例详解
2019/06/06 Python
tensorflow2.0保存和恢复模型3种方法
2020/02/03 Python
python安装dlib库报错问题及解决方法
2020/03/16 Python
django-利用session机制实现唯一登录的例子
2020/03/16 Python
解决python Jupyter不能导入外部包问题
2020/04/15 Python
pandas to_excel 添加颜色操作
2020/07/14 Python
商务主管岗位职责
2013/12/08 职场文书
电气工程师岗位职责
2014/01/01 职场文书
酒店端午节促销方案
2014/02/18 职场文书
小学一年级评语大全
2014/04/22 职场文书
小学六年级学生评语
2014/04/22 职场文书
高考学习决心书
2015/02/04 职场文书
物流仓管员岗位职责
2015/04/01 职场文书
家长意见和建议怎么写
2015/06/04 职场文书
生日赠语
2015/06/23 职场文书