我正在使用threading.Thread
来多线程化我的代码。
如果至少有一个线程没有在X秒内完成工作,我想抓住Timeout exception
。
我在这里找到了一些答案,描述了如何处理它,但大多数都是UNIX兼容的,而我使用的是Windows平台。
代码例如:
from threading import Thread
from time import sleep
def never_stop():
while 1 > 0:
print 'a'
sleep(5)
print 'b'
return
t1 = Thread(target=never_stop)
t1.start()
t2 = Thread(target=never_stop)
t2.start()
t3 = Thread(target=never_stop)
t3.start()
t1.join(2)
t2.join(2)
t3.join(2)
我尝试在join
方法中设置超时,但它没用..
有什么想法吗?
答案 0 :(得分:5)
来自文档: 当timeout参数存在而不是None时,它应该是一个浮点数,指定操作的超时(以秒为单位)(或其中的分数)。由于join()始终返回None,因此必须在join()之后调用isAlive()来决定是否发生超时 - 如果线程仍处于活动状态,则join()调用超时。
答案 1 :(得分:2)
最好的方法是让线程自行关闭(因此它可以关闭打开的文件或子线程,你永远不应该“杀死”你的线程)。
join
方法仅等待线程终止,它不会强制关闭
我建议您更改never_stop
方法以检查时间,并在时间超过return
限制后raise
或X
:
def never_stop():
time_started = time.time()
X = 2
while True:
if time.time() > time_started + X:
return # or raise TimeoutException()
print 'a' # do whatever you need to do
这样你的线程将在X
秒后自行结束,你甚至可以在创建线程时传递X作为参数:
def never_end(X):
# rest stays the same, except for the X = 2
t1 = threading.Thread(target=never_stop, args=(2,))
args
是一个元组,它的内容将作为参数传递给target
函数。