Python多线程threading join和守护线程setDeamon原理详解
作者:flag_HW 发布时间:2022-05-25 18:09:39
标签:Python,threading,join,线程,setDeamon
同一进程下的多个线程共享内存数据,多个线程之间没有主次关系,相互之间可以操作;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
来源:https://www.cnblogs.com/flags-blog/p/12443307.html
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- 遇到那种有很多图的微信公众号文章咋办?一个一个存很麻烦,应朋友的要求自己写了个爬虫。2.0版本完成了!完善了生成pdf的功能,可根据图片比例
- 目录1、关键字参数和位置参数(1)关键字参数(2)位置参数2、接受任意数量的参数(1)接受任意数量的位置参数(2)接受任意数量的关键字参数(
- 在设计网页时,没有比页面的外观更重要的了。所以,如果发现设计人员十分关注字体及字体大小,我并不感到惊奇。使用CSS来编辑字体有各种各样的方法
- 哲学上有种说法,“运动是绝对的,静止是相对的”。我们在编写各样的效果时,时常会碰到动画。下面的章,将讨论动画的原理以及实现。动画,简而言之就
- 1,GallerificGalleriffic 是使用 Mike Alsup 的 jQuery Cycle plugin 创建的图片展示效果
- 一、抓取全部评论吾的这篇文章,有 1022 次评论,一条条看,吾看不过来,于是想到 Python 词云,提取关键词,倒也是一桩趣
- 我们可用一个函数来实现小数转分数,不过只能转换能够整除的分数:Public Function XtoF(str 
- 以下是服务端代码var HTTPREQUEST_PROXYSETTING_DEFAULT = 0;var&nb
- 举例吧,这样更容易看的懂。例1:from django.core.exceptions import ObjectDoesNotExistt
- Hello 大家好,我是TANZAME,我们又见面了。NuGet是什么这里就不再重复啰嗦,园子里一搜一大把。今天要跟大家分享的是,在日常开发
- pandas每次多Sheet写入文件,只能一次性存入,不然每次会重写文件,最后只保留最后一次的写入。# !usr/bin env pytho
- on里面的xlrd模块详解(一) - 疯了的小蜗 - 博客园【内容】:>那我就一下面积个问题对xlrd模块进行学习一下:什么是xlrd
- UUID 全称是 Universally unique identifier,它是一种识别符,使用任意的计算机都可以生成,不需要一个中央数据
- 谷歌驱动下载地址:http://chromedriver.storage.googleapis.com/index.html一、seleni
- 本文实例讲述了wxPython窗口的继承机制,分享给大家供大家参考。具体分析如下:示例代码如下:import wx class
- 一.vue路由传值在日常使用vue操作时,某些场景需要用到路由之间的传值,就是在使用router跳转到另外一个路由时需要携带参数一并传过去,
- 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。以下文章来源于早起Python ,作者投
- sort包简介官方文档Golang的sort包用来排序,二分查找等操作。本文主要介绍sort包里常用的函数,通过实例代码来快速学会使用sor
- 本文实例讲述了symfony2.4的twig中date用法。分享给大家供大家参考,具体如下:获得当前时间:{{ "now"
- 对于数据实时同步,其核心是需要基于日志来实现,是可以实现准实时的数据同步,基于日志实现不会要求数据库本身在设计和实现中带来任何额外的约束。基