我正在研究 python 线程并遇到了join().
join()
作者告诉如果线程处于守护程序模式,那么我需要使用join()以便线程可以在主线程终止之前自行完成。
但我也看到他使用t.join()即使t不是daemon
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()因为它不是守护进程,即使我删除它我也看不到任何变化
一个有点笨拙的 ascii-art 来演示该机制:join()大概是由主线程调用的。它也可以由另一个线程调用,但会使图表不必要地复杂化。
join-calling应该放在主线程的轨道上,但是为了表达线程关系并保持它尽可能简单,我选择将它放在子线程中。
join
without join: +---+---+------------------ main-thread | | | +........... child-thread(short) +.................................. child-thread(long) with join +---+---+------------------***********+### main-thread | | | | +...........join() | child-thread(short) +......................join()...... child-thread(long) with join and daemon thread +-+--+---+------------------***********+### parent-thread | | | | | | +...........join() | child-thread(short) | +......................join()...... child-thread(long) +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, child-thread(long + daemonized) '-' main-thread/parent-thread/main-program execution '.' child-thread execution '#' optional parent-thread execution after join()-blocked parent-thread could continue '*' main-thread 'sleeping' in join-method, waiting for child-thread to finish ',' daemonized thread - 'ignores' lifetime of other threads; terminates when main-programs exits; is normally meant for join-independent tasks
所以你看不到任何变化的原因是你的主线程在你的join. 您可以说join(仅)与主线程的执行流程相关。
例如,如果您想同时下载一堆页面以将它们连接成一个大页面,您可以使用线程开始并发下载,但需要等到最后一个页面/线程完成才能开始组装单个页面在许多中。那是你使用的时候join()。