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使用PyV8执行javascript代码示例分享
Dec 04 Python
Python实现的双色球生成功能示例
Dec 18 Python
python如何将两个txt文件内容合并
Oct 18 Python
python matplotlib中的subplot函数使用详解
Jan 19 Python
PyCharm刷新项目(文件)目录的实现
Feb 14 Python
Django中的session用法详解
Mar 09 Python
基于Python的OCR实现示例
Apr 03 Python
python 在threading中如何处理主进程和子线程的关系
Apr 25 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
Jan 08 Python
Python opencv缺陷检测的实现及问题解决
Apr 24 Python
Python Socket编程详解
Apr 25 Python
Python编写车票订购系统 Python实现快递收费系统
Aug 14 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
Apache下禁止php文件被直接访问的解决方案
2013/04/25 PHP
php实现在线通讯录功能(附源码)
2016/05/13 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
js自定义事件代码说明
2011/01/31 Javascript
js图片闪动特效可以控制间隔时间如几分钟闪动一下
2014/08/12 Javascript
jquery显示loading图片直到网页加载完成的方法
2015/06/25 Javascript
基于dropdown.js实现的两款美观大气的二级导航菜单
2015/09/02 Javascript
javascript html5移动端轻松实现文件上传
2020/03/27 Javascript
在JavaScript中模拟类(class)及类的继承关系
2016/05/20 Javascript
js实现div模拟模态对话框展现URL内容
2016/05/27 Javascript
详解照片瀑布流效果(js,jquery分别实现与知识点总结)
2017/01/01 Javascript
vue指令以及dom操作详解
2017/03/04 Javascript
Angular2使用jQuery的方法教程
2017/05/28 jQuery
基于canvas粒子系统的构建详解
2017/08/31 Javascript
详解js删除数组中的指定元素
2018/10/31 Javascript
socket io与vue-cli的结合使用的示例代码
2018/11/01 Javascript
jQuery实现网页拼图游戏
2020/04/22 jQuery
JS拖动选择table里的单元格完整实例【基于jQuery】
2019/05/28 jQuery
js实现html滑动图片拼图验证
2020/06/24 Javascript
原生js实现无缝轮播图效果
2021/01/28 Javascript
Python设计模式之单例模式实例
2014/04/26 Python
打包发布Python模块的方法详解
2016/09/18 Python
查看python下OpenCV版本的方法
2018/08/03 Python
Django Rest framework之认证的实现代码
2018/12/17 Python
Windows上安装tensorflow  详细教程(图文详解)
2020/02/04 Python
通过python调用adb命令对App进行性能测试方式
2020/04/23 Python
通过代码简单了解django model序列化作用
2020/11/12 Python
HomeAway澳大利亚:预订你的度假屋,公寓、度假村、别墅等
2019/02/20 全球购物
英国首屈一指的票务公司:See Tickets
2019/05/11 全球购物
简述网络文件系统NFS,并说明其作用
2016/10/19 面试题
实习老师离校感言
2014/02/03 职场文书
电大毕业自我鉴定
2014/02/03 职场文书
课前一分钟演讲稿
2014/08/26 职场文书
教师三严三实学习心得体会
2014/10/11 职场文书
2015世界地球日活动总结
2015/02/09 职场文书
JPA 通过Specification如何实现复杂查询
2021/11/23 Java/Android