我想在一个线程中运行一个进程(迭代一个大的数据库表)。当线程运行时,我只想让程序等待。如果该线程花费的时间超过 30 秒,我想终止该线程并执行其他操作。通过终止线程,我的意思是我希望它停止活动并优雅地释放资源。
I figured the best way to do this was through a Thread()
’s join(delay)
and is_alive()
functions, and an Event
.使用 join(delay)
我可以让我的程序等待线程完成 30 秒,并且通过使用 is_alive()
函数我可以确定线程是否已完成其工作。如果它还没有完成它的工作,事件就会被设置,并且线程知道在那个时候停止工作。
这种方法是否有效,这是解决我的问题陈述的最 pythonic 方式吗?
这是一些示例代码:
import threading
import time
# The worker loops for about 1 minute adding numbers to a set
# unless the event is set, at which point it breaks the loop and terminates
def worker(e):
data = set()
for i in range(60):
data.add(i)
if not e.isSet():
print "foo"
time.sleep(1)
else:
print "bar"
break
e = threading.Event()
t = threading.Thread(target=worker, args=(e,))
t.start()
# 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()
else:
print "thread has already finished."
原文由 Matthew Moisen 发布,翻译遵循 CC BY-SA 4.0 许可协议
在这种情况下使用事件作为信号机制工作得很好,实际上在 线程模块文档 中推荐。
在验证线程终止时,超时几乎总是会引入错误空间。因此,虽然使用
.join()
初始决定触发事件的超时是好的,但最终验证应该使用.join()
没有超时。这可以简化为这样的事情: