摘自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()仍会返回。
,这对我来说毫无意义。
谢谢
答案 0 :(得分:0)
timeout参数表示它的含义。 d.join(0.3)
将在线程d
退出之后或在0.3秒之后(以先到者为准)返回。如果根据d
是否仍在运行对呼叫者执行不同的操作很重要,则必须调用d.is_alive()
来找出情况。
应对明显的种族状况会出现您的问题。
有人可以告诉我,为什么调用线程(主线程)...等待整整10秒钟吗?
这不是我在Python 3.5.4中运行您的程序时发生的事情。它在不到一秒钟的时间内为我终止,并且从未打印过(daemon ) Exiting
。您确定发布的代码与运行的代码相同吗?
如果是的话,您使用什么版本的Python来运行它?