我正在研究 python 线程并遇到了 join()
。
作者告诉我,如果线程处于守护进程模式,那么我需要使用 join()
以便线程可以在主线程终止之前自行完成。
但我也看到他使用 t.join()
尽管 t
不是 daemon
。
示例代码是这样的:
import threading
import time
import logging
logging.basicConfig(level=logging.DEBUG,
format='(%(threadName)-10s) %(message)s',
)
def daemon():
logging.debug('Starting')
time.sleep(2)
logging.debug('Exiting')
d = threading.Thread(name='daemon', target=daemon)
d.setDaemon(True)
def non_daemon():
logging.debug('Starting')
logging.debug('Exiting')
t = threading.Thread(name='non-daemon', target=non_daemon)
d.start()
t.start()
d.join()
t.join()
我不知道 t.join()
的用途是什么,因为它不是守护进程,即使删除它我也看不到任何变化
原文由 user192362127 发布,翻译遵循 CC BY-SA 4.0 许可协议
一个有点笨拙的 ascii-art 来演示该机制:
join()
大概是由主线程调用的。它也可以由另一个线程调用,但会不必要地使图表复杂化。join
调用应该放在主线程的轨道上,但是为了表达线程关系并尽可能简单,我选择放在子线程中。所以你看不到任何变化的原因是因为你的主线程在你的
join
之后什么都不做。您可以说join
(仅)与主线程的执行流程相关。例如,如果您想并发下载一堆页面以将它们连接成一个大页面,您可以使用线程开始并发下载,但需要等到最后一个页面/线程完成后再开始组装单个页面出许多。那就是你使用
join()
的时候。