Python: 开启多线程一定要使用join()方法吗?

转自segmentfault

问题由来

学习多线程中,实例代码中有使用join()这个函数。

# 引入互斥锁
threadLock = threading.Lock()
threads = []

# 创建新线程
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)

# 开启新线程
thread1.start()
thread2.start()

# 添加线程到线程列表
threads.append(thread1)
threads.append(thread2)

# 等待所有线程完成
for t in threads:
    t.join()
print "Exiting Main Thread"

此处代码有两处疑惑:

  1. 为什么要在线程start()了之后才加入线程列表?
  2. 还有就是为什么要使用join()来阻塞线程?

答疑1

在start前面还是后面append到列表是完全等价的。
因为你的程序(前面省略),等价于:

# 开启新线程
thread1.start()
thread2.start()

# 等待所有线程完成
thread1.join()
thread2.join()

print "Exiting Main Thread"

答疑2

线程有一个布尔属性叫做daemon。表示线程是否是守护线程,默认取否。
当程序中的线程全部是守护线程时,程序才会退出。只要还存在一个非守护线程,程序就不会退出。
主线程是非守护线程。
所以如果子线程的daemon属性不是True,那么即使主线程结束了,子线程仍然会继续执行。只有子线程的daemon属性是True时才需要用join

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,926评论 0 10
  • 线程 操作系统线程理论 线程概念的引入背景 进程 之前我们已经了解了操作系统中进程的概念,程序并不能单独运行,只有...
    go以恒阅读 1,706评论 0 6
  • 【threading模块详解】 模块基本方法 该模块定了的方法如下:threading.active_count(...
    奕剑听雨阅读 1,079评论 0 0
  • 进程和线程 进程 所有运行中的任务通常对应一个进程,当一个程序进入内存运行时,即变成一个进程.进程是处于运行过程中...
    胜浩_ae28阅读 5,186评论 0 23
  • 劳动节放假第一天。昨天晚上喝闲酒又喝了不少,一次又一次就是改不了,最近一段时间,身体感觉不是太舒服,情绪也不好,应...
    星之梦lyx阅读 126评论 0 0