小编典典

Python 线程中 join() 的用途是什么?

all

我正在研究 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()因为它不是守护进程,即使我删除它我也看不到任何变化


阅读 208

收藏
2022-05-12

共1个答案

小编典典

一个有点笨拙的 ascii-art 来演示该机制:join()大概是由主线程调用的。它也可以由另一个线程调用,但会使图表不必要地复杂化。

join-calling应该放在主线程的轨道上,但是为了表达线程关系并保持它尽可能简单,我选择将它放在子线程中。

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()

2022-05-12