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: 开启多线程一定要使用join()方法吗?)