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在校内发人人网状态(人人网看状态)
Feb 19 Python
在Python中操作日期和时间之gmtime()方法的使用
May 22 Python
Django基础之Model操作步骤(介绍)
May 27 Python
Python爬取成语接龙类网站
Oct 19 Python
Python获取航线信息并且制作成图的讲解
Jan 03 Python
python实现输入任意一个大写字母生成金字塔的示例
Oct 27 Python
python使用 cx_Oracle 模块进行查询操作示例
Nov 28 Python
Python字典深浅拷贝与循环方式方法详解
Feb 09 Python
Django 解决model 反向引用中的related_name问题
May 19 Python
python 调用Google翻译接口的方法
Dec 09 Python
Python自动化测试基础必备知识点总结
Feb 07 Python
Python基于Opencv识别两张相似图片
Apr 25 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 mssql 分页SQL语句优化 持续影响
2009/04/26 PHP
微信公众号点击菜单即可打开并登录微站的实现方法
2014/11/14 PHP
php获得文件大小和文件创建时间的方法
2015/03/13 PHP
PHP.ini安全配置检测工具pcc简单介绍
2015/07/02 PHP
PHP自定义错误处理的方法分析
2018/12/19 PHP
静态图片的十一种滤镜效果--不支持Ie7及非IE浏览器。
2007/03/06 Javascript
cookie丢失问题(认证失效) Authentication (用户验证信息)也会丢失
2009/06/04 Javascript
vue.js入门教程之计算属性
2016/09/01 Javascript
微信小程序 教程之wxapp视图容器 swiper
2016/10/19 Javascript
前端页面文件拖拽上传模块js代码示例
2017/05/19 Javascript
基于bootstrap页面渲染的问题解决方法
2018/08/09 Javascript
Vue从TodoList中学父子组件通信
2019/02/05 Javascript
详解json串反转义(消除反斜杠)
2019/08/12 Javascript
Vue使用mixin分发组件的可复用功能
2019/09/01 Javascript
Vue的data、computed、watch源码浅谈
2020/04/04 Javascript
Python数据类型详解(二)列表
2016/05/08 Python
Python实现曲线点抽稀算法的示例
2017/10/12 Python
详解pyppeteer(python版puppeteer)基本使用
2019/06/12 Python
Python+Selenium使用Page Object实现页面自动化测试
2019/07/14 Python
Django-Model数据库操作(增删改查、连表结构)详解
2019/07/17 Python
基于python计算滚动方差(标准差)talib和pd.rolling函数差异详解
2020/06/08 Python
Europcar德国:全球汽车租赁领域的领导者
2018/08/15 全球购物
EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的?
2013/02/17 面试题
介绍一下Ruby的特点
2013/01/20 面试题
有关打架的检讨书
2014/01/25 职场文书
大学生暑期社会实践证明范本
2014/10/24 职场文书
公务员考察材料范文
2014/12/23 职场文书
招标保密承诺书
2015/01/20 职场文书
校长个人总结
2015/03/03 职场文书
证券公司客户经理岗位职责
2015/04/09 职场文书
民事上诉状范文
2015/05/22 职场文书
2016年万圣节家长开放日活动总结
2016/04/05 职场文书
有关花店创业的计划书模板
2019/08/27 职场文书
java实现对Hadoop的操作
2021/07/01 Java/Android
python代码实现扫码关注公众号登录的实战
2021/11/01 Python
MySQL事务的隔离级别详情
2022/07/15 MySQL