python多线程threading之阻塞线程(join)线程同步和守护线程(setDaemon(True))实例详解

 

一、多线程(主线程和子线程同时执行)

1、主线程是程序本身,看不到的,主线程和子线程没有依赖关系,同步执行的,若主线程先执行完,会等子线程执行完毕,程序结束

2、启动一个线程就是把一个函数传入并创建Thread实例,然后调用start()开始执行run()

3、threading.currentThread(): 返回当前的线程变量<Thread(Thread-1, started 8056)>、<_MainThread(MainThread, started 14400)>

threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程;

threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果

run(): 用以表示线程活动的方法

start():启动线程活动

join(timeout): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生;

sAlive(): 返回线程是否活动的

getName(): 返回线程名;setName(): 设置线程名

4、多线程实例

#函数式多线程
import time,threading
def learnEnglish():print('%s 橙子在学习英语 %s'%(threading.currentThread(),time.ctime()))
def learnPython(name):print('%s %s在学习英语 %s'%(threading.currentThread(),name,time.ctime()))
def learnC(name,course):print('%s %s在学习%s %s'%(threading.currentThread(),name,course,time.ctime()))
start_time=time.time()
threads=[]# 创建线程数组
thread1=threading.Thread(target=learnEnglish)#创建线程
thread2=threading.Thread(target=learnPython,args=('橙汁',))
thread3=threading.Thread(target=learnC,args=('柠檬','C',))
thread4=threading.Thread(target=learnC,kwargs={"name":"王荔","course":"测试"})
threads.append(thread1)#将线程1添加到线程数组
threads.append(thread2)
threads.append(thread3)
threads.append(thread4)
for i in threads:i.start()#启动线程
run_times=(time.time()-start_time)
print('%s %s'%(threading.currentThread(),time.ctime()))
print('主线程和子线程运行时间共:%s'%run_times)C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py
<Thread(Thread-1, started 5664)> 橙子在学习英语 Thu Mar 14 13:12:25 2019
<Thread(Thread-2, started 6964)> 橙汁在学习英语 Thu Mar 14 13:12:25 2019
<Thread(Thread-3, started 17908)> 柠檬在学习C Thu Mar 14 13:12:25 2019
<Thread(Thread-4, started 17816)> 王荔在学习测试 Thu Mar 14 13:12:25 2019
<_MainThread(MainThread, started 12276)> Thu Mar 14 13:12:25 2019
主线程和子线程运行时间共:0.0009965896606445312Process finished with exit code 0
#多线程threading之封装
import threading,time
class MyThread(threading.Thread):#继承父类threading.Threaddef __init__(self,name,people):'''重写threading.Thread初始化内容'''super(MyThread,self).__init__()self.threadName=nameself.people=peopledef run(self):# 把要执行的代码写到run函数里面 线程在创建后会直接运行run函数print('开始线程%s %s'%(self.threadName,time.ctime()))print('结束线程%s %s'%(self.threadName,time.ctime()))
start_time=time.time()
print('开始主线程%s'%time.ctime())
thread1=MyThread('Thread-1','王荔')
thread2=MyThread('Thread-2','橙子')
thread1.start()
thread2.start()
print('退出主线程%s'%time.ctime())
run_times=(time.time()-start_time)
print('运行时间%s'%run_times)C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py
开始主线程Thu Mar 14 13:16:10 2019
开始线程Thread-1 Thu Mar 14 13:16:10 2019
结束线程Thread-1 Thu Mar 14 13:16:10 2019
开始线程Thread-2 Thu Mar 14 13:16:10 2019
退出主线程Thu Mar 14 13:16:10 2019
运行时间0.0009996891021728516
结束线程Thread-2 Thu Mar 14 13:16:10 2019Process finished with exit code 0-----可以看到主线程和子线程是同时运行的,主线程运行完,子线程可能还在运行;子线程运行完,主线程可能还在运行

 

二、多线程之线程阻塞,子线程.join()(设置在start之后,等所有阻塞线程运行完,再运行主线程)

1、阻塞主线程必须在start()方法后执行,t1.join()等线程1运行完,t2.join()等线程2运行完,再运行主线程

2、如果想让主线程等待子线程结束后再运行,就需用到【子线程.join()】,此方法是在start后(与setDaemon相反)

3、join(timeout)此方法有个timeout参数,是线程超时时间设置

4、阻塞线程和非阻塞线程实例

#非阻塞线程,主线程休眠1s,子线程休眠3s
时间未统计到子线程,只统计到主线程的,说明主线程和子线程是同步执行的,且主线程执行完了,子线程还在执行import threading,time
class MyThread(threading.Thread):#继承父类threading.Threaddef __init__(self,name,people):'''重写threading.Thread初始化内容'''super(MyThread,self).__init__()self.threadName=nameself.people=peopledef run(self):# 把要执行的代码写到run函数里面 线程在创建后会直接运行run函数print('开始线程%s %s'%(self.threadName,time.ctime()))time.sleep(3)print('结束线程%s %s'%(self.threadName,time.ctime()))
start_time=time.time()
print('开始主线程%s'%time.ctime())
thread1=MyThread('Thread-1','王荔')
thread2=MyThread('Thread-2','橙子')
thread1.start()
thread2.start()
#thread1.join()
#thread2.join()
print('退出主线程%s'%time.ctime())
time.sleep(1) 
run_times=(time.time()-start_time)C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py
开始主线程Thu Mar 14 13:30:07 2019
开始线程Thread-1 Thu Mar 14 13:30:07 2019
开始线程Thread-2 Thu Mar 14 13:30:07 2019
退出主线程Thu Mar 14 13:30:07 2019
运行时间1.0023198127746582
结束线程Thread-1 Thu Mar 14 13:30:10 2019
结束线程Thread-2 Thu Mar 14 13:30:10 2019Process finished with exit code 0
#阻塞线程1、阻塞线程2,主线程休眠1s,线程1和线程2休眠3s
主线程会等线程1和线程2执行完,才会继续执行主线程,统计时间为主线程1s+子线程3s=4s
import threading,time
class MyThread(threading.Thread):#继承父类threading.Threaddef __init__(self,name,people):'''重写threading.Thread初始化内容'''super(MyThread,self).__init__()self.threadName=nameself.people=peopledef run(self):# 把要执行的代码写到run函数里面 线程在创建后会直接运行run函数print('开始线程%s %s'%(self.threadName,time.ctime()))time.sleep(3)print('结束线程%s %s'%(self.threadName,time.ctime()))
start_time=time.time()
print('开始主线程%s'%time.ctime())
thread1=MyThread('Thread-1','王荔')
thread2=MyThread('Thread-2','橙子')
thread1.start()
thread2.start()
thread1.join()#阻塞线程1
thread2.join()#阻塞线程2
time.sleep(1)
print('退出主线程%s'%time.ctime())
run_times=(time.time()-start_time)
print('运行时间%s'%run_times)C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py
开始主线程Thu Mar 14 13:35:29 2019
开始线程Thread-1 Thu Mar 14 13:35:29 2019
开始线程Thread-2 Thu Mar 14 13:35:29 2019
结束线程Thread-1 Thu Mar 14 13:35:32 2019
结束线程Thread-2 Thu Mar 14 13:35:32 2019
退出主线程Thu Mar 14 13:35:33 2019
运行时间4.004500389099121Process finished with exit code 0
#阻塞线程实例# coding=utf-8
import threading
import timedef chiHuoGuo(people):print("%s 吃火锅的小伙伴-羊肉:%s" % (time.ctime(),people))time.sleep(1)print("%s 吃火锅的小伙伴-鱼丸:%s" % (time.ctime(),people))class myThread (threading.Thread):   # 继承父类threading.Threaddef __init__(self, people, name):'''重写threading.Thread初始化内容'''threading.Thread.__init__(self)self.threadName = nameself.people = peopledef run(self):   # 把要执行的代码写到run函数里面 线程在创建后会直接运行run函数'''重写run方法'''print("开始线程: " + self.threadName)chiHuoGuo(self.people)     # 执行任务print("qq交流群:226296743")print("结束线程: " + self.name)print("yoyo请小伙伴开始吃火锅:!!!")# 创建新线程
thread1 = myThread("xiaoming", "Thread-1")
thread2 = myThread("xiaowang", "Thread-2")# 开启线程
thread1.start()
thread2.start()# 阻塞主线程,等子线程结束
thread1.join()
thread2.join()time.sleep(0.1)
print("退出主线程:吃火锅结束,结账走人")C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py
yoyo请小伙伴开始吃火锅:!!!
开始线程: Thread-1
Thu Mar 14 13:41:10 2019 吃火锅的小伙伴-羊肉:xiaoming
开始线程: Thread-2
Thu Mar 14 13:41:10 2019 吃火锅的小伙伴-羊肉:xiaowang
Thu Mar 14 13:41:11 2019 吃火锅的小伙伴-鱼丸:xiaowang
qq交流群:226296743
结束线程: Thread-2
Thu Mar 14 13:41:11 2019 吃火锅的小伙伴-鱼丸:xiaoming
qq交流群:226296743
结束线程: Thread-1
退出主线程:吃火锅结束,结账走人Process finished with exit code 0

三、守护线程(设置在start之前,设置子线程A为守护线程,主线程所在的进程内所有非守护线程统统运行完毕 ,无论子线程A有没有结束,程序都结束)

1、主线程退出时,不等那些子线程完成,那就设置子线程为守护线程thread1.setDaemon(True)

2、设置一个线程为守护线程,就表示你在说这个线程不重要,在进程退出时,不用等待这个线程退出

3、程序在等待子线程结束,才退出,不需要设置线程守护,或者显示调用thread1.setDaemon(False)

4、主线程是非守护线程,只要还存在一个非守护线程,程序就不会退出。

5、守护线程必须在start()方法调用之前设置,如果不设置为守护线程,程序会被无限挂起

6、当有多个子线程时,守护线程就会等待所有的子线程运行完毕后,守护线程才会挂掉(这一点和主线程是一样的,都是等待所有的子线程运行完毕后才会挂掉)。

7、调用线程对象的方法setDaemon(true),则可以将其设置为守护线程。在python中建议使用的是thread.demon = true 使用这个方法可以检测数据合法性

8、setDaemon(True)此方法里面参数设置为True才会生效

9、对于主线程运行完毕,指的是主线程所在的进程内所有非守护线程统统都运行完毕,主线程才算运行完毕

10、守护线程实例

#设置线程1和线程2为守护线程
因为程序没有其他非守护线程,所以当主线程运行完,不等线程1和线程2,就直接结束import threading,time
class MyThread(threading.Thread):#继承父类threading.Threaddef __init__(self,name,people):'''重写threading.Thread初始化内容'''super(MyThread,self).__init__()self.threadName=nameself.people=peopledef run(self):# 把要执行的代码写到run函数里面 线程在创建后会直接运行run函数time.sleep(3)print('开始线程%s %s'%(self.threadName,time.ctime()))print('结束线程%s %s'%(self.threadName,time.ctime()))
start_time=time.time()
print('开始主线程%s'%time.ctime())
thread1=MyThread('Thread-1','王荔')
thread2=MyThread('Thread-2','橙子')
thread1.setDaemon(True)#设置为守护线程
thread2.setDaemon(True)#设置为守护线程
thread1.start()
thread2.start()
print('退出主线程%s'%time.ctime())
run_times=(time.time()-start_time)
print('运行时间%s'%run_times)C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py
开始主线程Thu Mar 14 13:59:09 2019
退出主线程Thu Mar 14 13:59:09 2019
运行时间0.0009975433349609375Process finished with exit code 0
#将线程2设置为守护线程
当线程1和主线程运行完,程序立即结束;故会存在2种结果:
当线程1先结束,就不会执行线程2结束
当线程2先结束,就会出执行线程2结束import threading,time
class MyThread(threading.Thread):#继承父类threading.Threaddef __init__(self,name,people):'''重写threading.Thread初始化内容'''super(MyThread,self).__init__()self.threadName=nameself.people=peopledef run(self):# 把要执行的代码写到run函数里面 线程在创建后会直接运行run函数print('开始线程%s %s'%(self.threadName,time.ctime()))time.sleep(3)print('结束线程%s %s'%(self.threadName,time.ctime()))
start_time=time.time()
print('开始主线程%s'%time.ctime())
thread1=MyThread('Thread-1','王荔')
thread2=MyThread('Thread-2','橙子')
#thread1.setDaemon(True)#设置为守护线程
thread2.setDaemon(True)#设置为守护线程
thread2.start()
thread1.start()
print('退出主线程%s'%time.ctime())
run_times=(time.time()-start_time)
print('运行时间%s'%run_times)C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py
开始主线程Thu Mar 14 14:11:07 2019
开始线程Thread-2 Thu Mar 14 14:11:07 2019
开始线程Thread-1 Thu Mar 14 14:11:07 2019
退出主线程Thu Mar 14 14:11:07 2019
运行时间0.0009958744049072266
结束线程Thread-2 Thu Mar 14 14:11:10 2019
结束线程Thread-1 Thu Mar 14 14:11:10 2019Process finished with exit code 0C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py
开始主线程Thu Mar 14 14:13:03 2019
开始线程Thread-2 Thu Mar 14 14:13:03 2019
开始线程Thread-1 Thu Mar 14 14:13:03 2019
退出主线程Thu Mar 14 14:13:03 2019
运行时间0.0009908676147460938
结束线程Thread-1 Thu Mar 14 14:13:06 2019Process finished with exit code 0
#守护线程实例# coding=utf-8
import threading
import timedef chiHuoGuo(people):print("%s 吃火锅的小伙伴-羊肉:%s" % (time.ctime(),people))time.sleep(1)print("%s 吃火锅的小伙伴-鱼丸:%s" % (time.ctime(),people))class myThread (threading.Thread):   # 继承父类threading.Threaddef __init__(self, people, name):'''重写threading.Thread初始化内容'''threading.Thread.__init__(self)self.threadName = nameself.people = peopledef run(self):   # 把要执行的代码写到run函数里面 线程在创建后会直接运行run函数'''重写run方法'''print("开始线程: " + self.threadName)chiHuoGuo(self.people)     # 执行任务print("qq交流群:226296743")print("结束线程: " + self.name)print("yoyo请小伙伴开始吃火锅:!!!")# 创建新线程
thread1 = myThread("xiaoming", "Thread-1")
thread2 = myThread("xiaowang", "Thread-2")# 守护线程setDaemon(True)
thread1.setDaemon(True)       # 必须在start之前
thread2.setDaemon(True)# 开启线程
thread1.start()
thread2.start()time.sleep(0.1)
print("退出主线程:吃火锅结束,结账走人")C:\Users\wangli\PycharmProjects\AutoMation\venv\Scripts\python.exe C:/Users/wangli/PycharmProjects/AutoMation/case/test.py
yoyo请小伙伴开始吃火锅:!!!
开始线程: Thread-1
Thu Mar 14 14:22:20 2019 吃火锅的小伙伴-羊肉:xiaoming
开始线程: Thread-2
Thu Mar 14 14:22:20 2019 吃火锅的小伙伴-羊肉:xiaowang
退出主线程:吃火锅结束,结账走人Process finished with exit code 0

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/568501.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python】pyCryptodome模块实现AES加密、解密

高级加密标准&#xff08;英语&#xff1a;Advanced Encryption Standard&#xff0c;缩写&#xff1a;AES&#xff09;&#xff0c;在密码学中又称Rijndael加密法&#xff0c;是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES&#xff0c;已经被多方分析且广…

python多线程之线程锁(Lock)和递归锁(RLock)实例

一、线程锁 Threading模块为我们提供了一个类&#xff0c;Threading.Lock锁。我们创建一个该类对象&#xff0c;在线程函数执行前&#xff0c;“抢占”该锁&#xff0c;执行完成后&#xff0c;“释放”该锁&#xff0c;则我们确保了每次只有一个线程占有该锁。这时候对一个公共…

并发编程:进程,线程,协程,异步

并发编程&#xff08;不是并行&#xff09;目前有四种方式&#xff1a;多进程、多线程、协程和异步。 多进程编程在python中有类似C的os.fork,更高层封装的有multiprocessing标准库多线程编程python中有Thread和threading异步编程在linux下主要有三种实现select&#xff0c;po…

jmeter环境部署

win环境下&#xff1a; 1、复制jmeter整个包到本地解压、安装jdk 2、jdk环境环境变量配置&#xff08;电脑-属性-高级系统设置-环境变量&#xff09; 系统变量JAVA_HOME 变量值C:\Program Files\Java\jdk1.8.0_101 用户变量path 变量值%JAVA_HOME%\bin cmd下输java或jav…

【Python】pdf2image模块+poppler将PDF转换为图片

有时我们需要将PDF转换成图片&#xff0c;今天我们主要说的是pdf2imagepoppler对PDF转换成图片格式。 pdf2image是个包装器&#xff0c;真正的转换工具是poppler GitHub地址&#xff1a;https://github.com/Belval/pdf2image &#xff0c;上面也有相关的配置说明。 1、安装pdf…

jmeter五种参数化方式之CSV Data Set Config参数化

一、用户定义的变量 一般会设置全局不变的参数&#xff0c;如host、账号、密码等 设置名称username&#xff0c;password 值王荔&#xff0c;123456 线程设置2次和循环设置2次&#xff0c;2次采样器传参和结果一样 二、用户参数 添加用户参数 设置3组参数 参数化 当线程设置…

【Python】PyMuPDF模块将PDF转换为图片

上一篇文章介绍了pdf2image模块poppler将PDF转换为图片&#xff0c;这篇文章主要介绍另外一个模块PyMuPDF。 PyMuPDF&#xff08;又名“fitz”&#xff09;&#xff1a;MuPDF的Python绑定&#xff0c;它是一个轻量级的PDF和XPS查看器。该库可以访问PDF&#xff0c;XPS&#xf…

【Liunx服务器】阿里云服务器下部署多个tomcat服务

现在有这样一个场景&#xff0c;一个阿里云服务器上面已经有tomcat项目和多个maven项目&#xff0c;现在需要在一个新项目中配置一个空的tomcat&#xff0c;现将具体流程记录下来。 1.下载tomcat包或者找到已下载的包 2.将tomcat的包解压到指定项目目录&#xff1a;/data/proj…

【测试】身份证的前世今生

在我们的测试中,经常要校验身份证的有效性,但是我们大多数人并不清楚身份证具体是如何组成的,有什么特点,下面我们就了解一下它的前世今生。 身份证由来 从1999年10月1日起,全国实行公民身份证号码制度,居民身份证编号由原15位升至18位。 根据〖中华人民共和国国家标准…

C++根据输入日期YYYY-MM-DD判断是否星期几

参考链接&#xff1a; https://blog.csdn.net/bible521125/article/details/50418436 https://blog.csdn.net/tojohnonly/article/details/78326633 https://blog.csdn.net/fengbingchun/article/details/54835571

【音频】音频文件格式以及相关参数

音频是个专业术语&#xff0c;音频一词已用作一般性描述音频范围内和声音有关的设备及其作用。人类能够听到的所有声音都称之为音频&#xff0c;它可能包括噪音等。 声音被录制下来以后&#xff0c;无论是说话声、歌声、乐器都可以通过数字音乐软件处理&#xff0c;或是把它制作…

python 按照当前日期创建文件

import time import os.path#获得当前系统时间的字符串 localtimetime.strftime(%Y-%m-%d %H:%M:%S,time.localtime(time.time())) print(localtimelocaltime) #系统当前时间年份 yeartime.strftime(%Y,time.localtime(time.time())) #月份 monthtime.strftime(%m,time.localti…

【Python】Python中内置的%操作符

Python中内置的%操作符可用于格式化字符串操作&#xff0c;控制字符串的呈现格式。Python中还有其他的格式化字符串的方式&#xff0c;但%操作符的使用是最方便的。 格式符为真实值预留位置&#xff0c;并控制显示的格式。格式符可以包含有一个类型码&#xff0c;用以控制显示的…

数据结构二叉树遍历求后序

注意左右子树的递归 参考自https://blog.csdn.net/hou_blog/article/details/50015503

python queue队列

作用&#xff1a; 解耦&#xff1a;使程序直接实现松耦合&#xff0c;修改一个函数&#xff0c;不会有串联关系。 提高处理效率&#xff1a;&#xff26;&#xff29;&#xff26;&#xff2f; &#xff1d; 现进先出&#xff0c;&#xff2c;&#xff29;&#xff26;&#…

【Python】ffmpeg模块查询视频、音频信息

FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。 它包含了非常先进的音频/视频编解码库libavcodec&#xff0c;为了保证高可移植性和编解码质量&#xff…

log4j学习

依赖 <!--log4j依赖--> <dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version> </dependency><!--测试--> <dependency><groupId>org.junit.jupiter</g…

navicat连接远程mysql数据库

前提&#xff1a;保证你的navicat数据是允许外界可以连接 1.保证两台电脑应在同一局域网内 2.查询被连接数据库电脑的ip 3.在连接端&#xff0c;主机那个填入ip地址&#xff0c;用户名&#xff0c;密码等信息。测试连接 4、连接成功后&#xff0c;用此ip即为连接数据库的ho…

【Python】ffmpeg模块处理视频、音频信息

多媒体视频处理工具FFmpeg有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。 这里主要介绍一下FFmpeg的一些常用参数&#xff0c;并且主要功能&#xff1a;截取视频、视频格式转换、视频分辨率转换、视频合并、提取视频、提取音频、提取图片、视频水…

【探索测试篇】探索无界,BUG无限,让程序猿头疼的测试技术

探索无界&#xff0c;BUG无限 一、修改系统时间 当功能模块中存在倒计时、计时器、时间&#xff0c;与时间有关系时&#xff0c;尝试修改系统时间&#xff0c;测试系统时间是否参与计算&#xff0c;修改系统时间是否会影响到倒计时、计时、时间等与时间有关系的模块 例&#…