我想在一个线程(它正在遍历大型数据库表)中运行一个进程。线程运行时,我只想让程序等待。如果该线程需要30秒以上,我想杀死线程并执行其他操作。通过杀死线程,我的意思是我希望它停止活动并优雅地释放资源。大部分Pythonic方法在一段时间后杀死线程
我想通做的最好的方式,这是通过Thread()
的join(delay)
和is_alive()
功能,以及Event
。使用join(delay)
我可以让我的程序等待30秒以完成线程,通过使用is_alive()
函数,我可以确定线程是否已完成其工作。如果尚未完成其工作,则会设置该事件,并且该线程知道在该点停止工作。
是这种方法有效,这是去我的问题语句的最Python的方式?
下面是一些示例代码:
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."