join()在Python线程中有什么用途?

我在研究python线程时遇到了join()

作者告诉我,如果线程处于守护程序模式,那么我需要使用join(),这样线程就可以在主线程终止之前完成自己的工作

但是我也见过他使用t.join()即使t不是daemon

示例代码如下

导入线程
导入时间
导入日志记录
logging.basicConfig(级别=logging.DEBUG,
格式=’((threadName)-10s)%(消息)s’,
)
def守护进程():
logging.debug(’Starting’)
时间。睡眠(2)
logging.debug(’正在退出’)
线程(name=’daemon’,target=daemon)
d、 setDaemon(True)
def non_daemon():
logging.debug(’Starting’)
logging.debug(’正在退出’)
t=threading.Thread(name=’non-daemon’,target=non_-daemon)
d、 开始()
t、 开始()
d、 加入
t、 加入

我不知道t.join()有什么用,因为它不是守护进程,即使删除它,我也看不到任何更改

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

join-调用应该放在主线程的轨道上,但是为了表示线程关系并使其尽可能简单,我选择将其放在子线程中

无连接:
+---+---+------------------主线
|   |
|   +...........                            子线程(短)
+..................................         子线程(长)
加入
+---+---+------------------***********+###主线
|   |                             |
|+………连接()|子线程(短)
+连接()。。。。。。子线程(长)
使用join和守护进程线程
+-+--+---+------------------***********+###父线程
|  |   |                             |
||+………连接()|子线程(短)
|+连接()。。。。。。子线程(长)
+子线程(长+守护进程化)
“-”主线程/父线程/主程序执行
“.”子线程执行
“#”可选在join()之后执行父线程-无法阻止父线程
持续
“*”主线程在联接方法中“休眠”,正在等待子线程完成
'守护线程-'忽略'其他线程的生存期;
当主程序退出时终止;通常指的是
加入独立任务

因此,您没有看到任何更改的原因是,您的主线程在加入之后什么也不做。
您可以说,join只与主线程的执行流相关

例如,如果您希望同时下载一组页面以将它们连接到单个大页面中,则可以使用线程开始并发下载,但需要等到最后一个页面/线程完成后,才能开始从多个页面中组合单个页面。这就是使用join()的时候

发表评论