超时的.join()仍在等待守护程序线程?

时间:2018-08-30 15:24:02

标签: python-3.x multithreading

摘自documentation,尤其是这一部分:

  

这将阻塞调用线程,直到其join()方法为   称为终止–正常或通过未处理的异常终止   – 或直到可选超时发生

我收集到,当timeout不是None时,调用线程应该等待守护程序,等待该时间后再退出(如果其他非守护程序线程完成了工作)。虽然,这个例子证明了不同,但是我的理解是错误的:

import threading
import time
import logging


def daemon():
    logging.debug('Starting')
    time.sleep(10)
    logging.debug('Exiting')


def non_daemon():
    logging.debug('Starting')
    logging.debug('Exiting')


logging.basicConfig(
    level=logging.DEBUG,
    format='(%(threadName)-10s) %(message)s',
)

d = threading.Thread(name='daemon', target=daemon, daemon=True)

t = threading.Thread(name='non-daemon', target=non_daemon)

d.start()

t.start()

d.join(0.3)
print('d.isAlive()', d.isAlive())
t.join()

有人可以向我解释一下,为什么等待守护进程线程0.3秒后调用线程(主线程)没有退出?而是等待整整10秒?显然,我不理解超时参数的含义。我在Internet上找到的所有解释都是相同的,基本上都是这样:

  

还可以传递一个表示值的浮点数   等待该线程变为非活动状态的秒数。如果线程确实   超时时间内未完成,join()仍会返回。

,这对我来说毫无意义。

谢谢

1 个答案:

答案 0 :(得分:0)

timeout参数表示它的含义。 d.join(0.3)将在线程d退出之后或在0.3秒之后(以先到者为准)返回。如果根据d是否仍在运行对呼叫者执行不同的操作很重要,则必须调用d.is_alive()来找出情况。

应对明显的种族状况会出现您的问题。

  

有人可以告诉我,为什么调用线程(主线程)...等待整整10秒钟吗?

这不是我在Python 3.5.4中运行您的程序时发生的事情。它在不到一秒钟的时间内为我终止,并且从未打印过(daemon ) Exiting。您确定发布的代码与运行的代码相同吗?

如果是的话,您使用什么版本的Python来运行它?