python多线程中join()的理解
在 Python 的多线程编程中,经常碰到 thread.join()这样的代码。那么今天咱们用实际代码来解释一下 join 函数的作用。
第一,当一个进程启动之后,会默认产生一个主线程,因为线程是程序执行流的最小单元,当设置多线程时,主线程会创建多个子线程,在python中,默认情况下(其实就是setDaemon(False)),主线程执行完自己的任务以后,就退出了,此时子线程会继续执行自己的任务,直到自己的任务结束,例子见下面。
# coding: utf-8 # 测试多线程中join的功能 import threading, time def doWaiting():print 'start waiting1: ' + time.strftime('%H:%M:%S') + "\n"time.sleep(3)print 'stop waiting1: ' + time.strftime('%H:%M:%S') + "\n" def doWaiting1():print 'start waiting2: ' + time.strftime('%H:%M:%S') + "\n"time.sleep(8)print 'stop waiting2: ', time.strftime('%H:%M:%S') + "\n" tsk = [] thread1 = threading.Thread(target = doWaiting) thread1.start() tsk.append(thread1) thread2 = threading.Thread(target = doWaiting1) thread2.start() tsk.append(thread2) print 'start join: ' + time.strftime('%H:%M:%S') + "\n"print 'end join: ' + time.strftime('%H:%M:%S') + "\n"
代码执行结果如下:
start waiting1: 22:24:20start join: 22:24:20 start waiting2: 22:24:20end join: 22:24:20stop waiting1: 22:24:23stop waiting2: 22:24:28
第二,当我们使用setDaemon(True)方法,设置子线程为守护线程时,主线程一旦执行结束,则全部线程全部被终止执行,可能出现的情况就是,子线程的任务还没有完全执行结束,就被迫停止,例子见下面。
1 # coding: utf-82 # 测试多线程中join的功能3 import threading, time4 def doWaiting():5 print 'start waiting1: ' + time.strftime('%H:%M:%S') + "\n"6 time.sleep(3)7 print 'stop waiting1: ' + time.strftime('%H:%M:%S') + "\n"8 def doWaiting1():9 print 'start waiting2: ' + time.strftime('%H:%M:%S') + "\n" 10 time.sleep(8) 11 print 'stop waiting2: ', time.strftime('%H:%M:%S') + "\n" 12 tsk = [] 13 thread1 = threading.Thread(target = doWaiting) 14 thread1.setDaemon(True) 15 thread1.start() 16 tsk.append(thread1) 17 thread2 = threading.Thread(target = doWaiting1) 18 thread2.setDaemon(True) 19 thread2.start() 20 tsk.append(thread2) 21 print 'start join: ' + time.strftime('%H:%M:%S') + "\n" 22 23 print 'end join: ' + time.strftime('%H:%M:%S') + "\n"
代码执行结果如下:
start waiting1: 22:34:46start waiting2: 22:34:46 start join: 22:34:46end join: 22:34:46
第三,没有设置守护线程且没有设置join函数的timeout参数时,主线程将会一直等待,直到子线程全部结束,主线程才结束,程序退出。代码如下:
1 # coding: utf-82 # 测试多线程中join的功能3 import threading, time4 def doWaiting():5 print 'start waiting1: ' + time.strftime('%H:%M:%S') + "\n"6 time.sleep(3)7 print 'stop waiting1: ' + time.strftime('%H:%M:%S') + "\n"8 def doWaiting1():9 print 'start waiting2: ' + time.strftime('%H:%M:%S') + "\n" 10 time.sleep(8) 11 print 'stop waiting2: ', time.strftime('%H:%M:%S') + "\n" 12 tsk = [] 13 thread1 = threading.Thread(target = doWaiting) 14 thread1.start() 15 tsk.append(thread1) 16 thread2 = threading.Thread(target = doWaiting1) 17 thread2.start() 18 tsk.append(thread2) 19 print 'start join: ' + time.strftime('%H:%M:%S') + "\n" 20 for tt in tsk: 21 tt.join() 22 print 'end join: ' + time.strftime('%H:%M:%S') + "\n"
代码执行结果如下:
start waiting1: 22:41:50start join: 22:41:50 start waiting2: 22:41:50stop waiting1: 22:41:53stop waiting2: 22:41:58end join: 22:41:58
第四,当没有设置守护线程且join函数的参数timeout=2时,主线程将会等待多个子线程timeout的累加和这样的一段时间,时间一到,主线程结束,但是并没有杀死子线程,子线程依然可以继续执行,直到子线程全部结束,程序退出。代码如下:
1 # coding: utf-82 # 测试多线程中join的功能3 import threading, time4 def doWaiting():5 print 'start waiting1: ' + time.strftime('%H:%M:%S') + "\n"6 time.sleep(3)7 print 'stop waiting1: ' + time.strftime('%H:%M:%S') + "\n"8 def doWaiting1():9 print 'start waiting2: ' + time.strftime('%H:%M:%S') + "\n" 10 time.sleep(8) 11 print 'stop waiting2: ', time.strftime('%H:%M:%S') + "\n" 12 tsk = [] 13 thread1 = threading.Thread(target = doWaiting) 14 thread1.start() 15 tsk.append(thread1) 16 thread2 = threading.Thread(target = doWaiting1) 17 thread2.start() 18 tsk.append(thread2) 19 print 'start join: ' + time.strftime('%H:%M:%S') + "\n" 20 for tt in tsk: 21 tt.join(2) 22 print 'end join: ' + time.strftime('%H:%M:%S') + "\n"
代码执行结果如下:
start waiting1: 23:02:34start waiting2: 23:02:34 start join: 23:02:34stop waiting1: 23:02:37end join: 23:02:38stop waiting2: 23:02:42
第五,当设置守护线程join函数的参数timeout=2时,主线程将会等待多个子线程timeout的累加和这样的一段时间,时间一到,主线程结束,杀死未执行完的子线程,程序退出。代码如下:
1 # coding: utf-82 # 测试多线程中join的功能3 import threading, time4 def doWaiting():5 print 'start waiting1: ' + time.strftime('%H:%M:%S') + "\n"6 time.sleep(3)7 print 'stop waiting1: ' + time.strftime('%H:%M:%S') + "\n"8 def doWaiting1():9 print 'start waiting2: ' + time.strftime('%H:%M:%S') + "\n" 10 time.sleep(8) 11 print 'stop waiting2: ', time.strftime('%H:%M:%S') + "\n" 12 tsk = [] 13 thread1 = threading.Thread(target = doWaiting) 14 thread1.setDaemon(True) 15 thread1.start() 16 tsk.append(thread1) 17 thread2 = threading.Thread(target = doWaiting1) 18 thread2.setDaemon(True) 19 thread2.start() 20 tsk.append(thread2) 21 print 'start join: ' + time.strftime('%H:%M:%S') + "\n" 22 for tt in tsk: 23 tt.join(2) 24 print 'end join: ' + time.strftime('%H:%M:%S') + "\n"
代码执行结果如下:
start waiting1: 23:23:57start waiting2: 23:23:57 start join: 23:23:57stop waiting1: 23:24:00end join: 23:24:01
转载于:https://www.cnblogs.com/linkenpark/p/11180571.html
python多线程中join()的理解相关推荐
- 【python教程】对多线程中join()的详细教程
在 Python 的多线程编程中,经常碰到 thread.join()这样的代码.那么今天咱们用实际代码来解释一下 join 函数的作用. 一. 当一个进程启动之后,会默认产生一个主线程,因为线程是程 ...
- Python 多线程中的 join() 和 setDaemon()
Demo 是最好的老师!!! 参考链接:Python多线程与多线程中join()的用法 - cnkai - 博客园 知识点一(setDaemon(False)): 当一个进程启动之后,会默认产生一个主 ...
- python 多线程 setdaemon_彻底理解Python多线程中的setDaemon与join配有GIF示意
在进行Python多线程编程时, join()和 setDaemon()是最常用的方法,下面说说两者的用法和区别. 1.join () 例子:主线程A中,创建了子线程B,并且在主线程A中调用了B.jo ...
- python 多线程 setdaemon_彻底理解Python多线程中的setDaemon与join【配有GIF示意】
在进行Python多线程编程时, join()和 setDaemon()是最常用的方法,下面说说两者的用法和区别. 1.join () 例子:主线程A中,创建了子线程B,并且在主线程A中调用了B.jo ...
- python如何使用多线程_Python多线程与多线程中join()的用法
Python多线程与多进程中join()方法的效果是相同的. 下面仅以多线程为例: 首先需要明确几个概念: 知识点一: 当一个进程启动之后,会默认产生一个主线程,因为线程是程序执行流的最小单元,当设置 ...
- JAVA多线程中join()方法的详细分析
虽然关于讨论线程join()方法的博客已经非常极其特别多了,但是前几天我有一个困惑却没有能够得到详细解释,就是当系统中正在运行多个线程时,join()到底是暂停了哪些线程,大部分博客给的例子看起来都像 ...
- 关于多线程中锁的理解
2019独角兽企业重金招聘Python工程师标准>>> 在多线程中,锁是非常重要的一个东西. 在Java语言中,有对象和类之分,因此多线程的锁也可分为对象锁和类锁. 对象锁,顾名思义 ...
- python join_Python中join()方法的用法
Python中join()方法的主要作用是以特定的字符或字符串作为分隔符(字符串)将若干字符串拼接在一起.其作用的对象可以是单独的一个字符串,也可以是一个字符串元组,字符串列表.字符串集合或字符串字典 ...
- 61_有关多线程中join方法详解
Java中join()方法的理解 thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程. 比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后, ...
最新文章
- 第六课.GNN的可解释性
- ERP的风险及其预防
- (JAVA学习笔记) 接口
- 腾讯极客挑战赛正式开赛!「鹅罗斯方块」开“玩”啦
- int?id与id??1 的意思
- 苹果屏幕上的小圆点_苹果或明年部署miniLED屏幕 最早用在Macbook上
- bean json转kotlin_Android--------kotlin插件神器Json直接生成javaBean
- html给图片设置编剧,漫画简明编剧教程【4】如何设计角色
- 创建二叉树的代码_解二叉树的右视图的两种方式
- 面向对象第二节课,属性,构造方法,成员方法
- linux shell 递归统计代码行数
- 前端解决第三方图片防盗链的办法 - html referrer 访问图片资源 403 问题
- Miller_Rabin测试法
- 这就是搜索引擎--读书笔记四--索引基础
- 工程电磁场复习基本知识点
- android信鸽推送通知栏,【信鸽推送】点击推送通知后,默认会从程序Launcher进入,返回时会回到主界面的问题...
- 【《机器学习》周志华学习笔记2.3.4】~模型评估与选择-代价敏感错误率与代价曲线
- Cookie起源与发展
- 南航C语言答案,2009-2011南航复试题(回忆版) 予人玫瑰,手有余香
- Winner-Take-All Autoencoders ( 赢者通吃自编码器)
热门文章
- MinIO集群怎么接入Prometheus监控?(上)
- 前端系列第10集-实战篇
- 海尔为什么要向青年一代提出“修身”解决方案?
- 移动硬盘安装centos8
- c 语言 控制台程序 行字体颜色,C# 控制台程序设置字体颜色
- ‘\0’ ,‘0’, “0” ,0之间的区别
- 全球首家多语言智能客服上线,这家神秘AI公司有什么秘密武器?
- (小脚本) (python) 批量修改文件后缀名
- noip题库 —— 4.7反质数
- 年底找工作,怎么解释离职的原因?