小编典典
在这种情况下,使用事件作为信号传递机制就可以了,实际上在线程模块docs中建议使用。
如果您希望线程正常停止,请使其成为非守护进程,并使用适当的信号传递机制,例如Event。
验证线程终止时,超时几乎总是会引入错误空间。因此,虽然将.join()with超时用于触发事件的初始决策是可以的,但最终验证应使用.join()没有超时的a
进行。
# wait 30 seconds for the thread to finish its work
t.join(30)
if t.is_alive():
print "thread is not done, setting event to kill thread."
e.set()
# The thread can still be running at this point. For example, if the
# thread's call to isSet() returns right before this call to set(), then
# the thread will still perform the full 1 second sleep and the rest of
# the loop before finally stopping.
else:
print "thread has already finished."
# Thread can still be alive at this point. Do another join without a timeout
# to verify thread shutdown.
t.join()
可以简化为以下形式:
# Wait for at most 30 seconds for the thread to complete.
t.join(30)
# Always signal the event. Whether the thread has already finished or not,
# the result will be the same.
e.set()
# Now join without a timeout knowing that the thread is either already
# finished or will finish "soon."
t.join()
2020-12-20