在 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()的理解相关推荐

  1. 【python教程】对多线程中join()的详细教程

    在 Python 的多线程编程中,经常碰到 thread.join()这样的代码.那么今天咱们用实际代码来解释一下 join 函数的作用. 一. 当一个进程启动之后,会默认产生一个主线程,因为线程是程 ...

  2. Python 多线程中的 join() 和 setDaemon()

    Demo 是最好的老师!!! 参考链接:Python多线程与多线程中join()的用法 - cnkai - 博客园 知识点一(setDaemon(False)): 当一个进程启动之后,会默认产生一个主 ...

  3. python 多线程 setdaemon_彻底理解Python多线程中的setDaemon与join配有GIF示意

    在进行Python多线程编程时, join()和 setDaemon()是最常用的方法,下面说说两者的用法和区别. 1.join () 例子:主线程A中,创建了子线程B,并且在主线程A中调用了B.jo ...

  4. python 多线程 setdaemon_彻底理解Python多线程中的setDaemon与join【配有GIF示意】

    在进行Python多线程编程时, join()和 setDaemon()是最常用的方法,下面说说两者的用法和区别. 1.join () 例子:主线程A中,创建了子线程B,并且在主线程A中调用了B.jo ...

  5. python如何使用多线程_Python多线程与多线程中join()的用法

    Python多线程与多进程中join()方法的效果是相同的. 下面仅以多线程为例: 首先需要明确几个概念: 知识点一: 当一个进程启动之后,会默认产生一个主线程,因为线程是程序执行流的最小单元,当设置 ...

  6. JAVA多线程中join()方法的详细分析

    虽然关于讨论线程join()方法的博客已经非常极其特别多了,但是前几天我有一个困惑却没有能够得到详细解释,就是当系统中正在运行多个线程时,join()到底是暂停了哪些线程,大部分博客给的例子看起来都像 ...

  7. 关于多线程中锁的理解

    2019独角兽企业重金招聘Python工程师标准>>> 在多线程中,锁是非常重要的一个东西. 在Java语言中,有对象和类之分,因此多线程的锁也可分为对象锁和类锁. 对象锁,顾名思义 ...

  8. python join_Python中join()方法的用法

    Python中join()方法的主要作用是以特定的字符或字符串作为分隔符(字符串)将若干字符串拼接在一起.其作用的对象可以是单独的一个字符串,也可以是一个字符串元组,字符串列表.字符串集合或字符串字典 ...

  9. 61_有关多线程中join方法详解

    Java中join()方法的理解 thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程. 比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后, ...

最新文章

  1. 第六课.GNN的可解释性
  2. ERP的风险及其预防
  3. (JAVA学习笔记) 接口
  4. 腾讯极客挑战赛正式开赛!「鹅罗斯方块」开“玩”啦
  5. int?id与id??1 的意思
  6. 苹果屏幕上的小圆点_苹果或明年部署miniLED屏幕 最早用在Macbook上
  7. bean json转kotlin_Android--------kotlin插件神器Json直接生成javaBean
  8. html给图片设置编剧,漫画简明编剧教程【4】如何设计角色
  9. 创建二叉树的代码_解二叉树的右视图的两种方式
  10. 面向对象第二节课,属性,构造方法,成员方法
  11. linux shell 递归统计代码行数
  12. 前端解决第三方图片防盗链的办法 - html referrer 访问图片资源 403 问题
  13. Miller_Rabin测试法
  14. 这就是搜索引擎--读书笔记四--索引基础
  15. 工程电磁场复习基本知识点
  16. android信鸽推送通知栏,【信鸽推送】点击推送通知后,默认会从程序Launcher进入,返回时会回到主界面的问题...
  17. 【《机器学习》周志华学习笔记2.3.4】~模型评估与选择-代价敏感错误率与代价曲线
  18. Cookie起源与发展
  19. 南航C语言答案,2009-2011南航复试题(回忆版) 予人玫瑰,手有余香
  20. Winner-Take-All Autoencoders ( 赢者通吃自编码器)

热门文章

  1. MinIO集群怎么接入Prometheus监控?(上)
  2. 前端系列第10集-实战篇
  3. 海尔为什么要向青年一代提出“修身”解决方案?
  4. 移动硬盘安装centos8
  5. c 语言 控制台程序 行字体颜色,C# 控制台程序设置字体颜色
  6. ‘\0’ ,‘0’, “0” ,0之间的区别
  7. 全球首家多语言智能客服上线,这家神秘AI公司有什么秘密武器?
  8. (小脚本) (python) 批量修改文件后缀名
  9. noip题库 —— 4.7反质数
  10. 年底找工作,怎么解释离职的原因?