如何设置线程超时?

时间:2016-02-22 07:58:35

标签: python windows multithreading python-2.7 timeout

我正在使用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方法中设置超时,但它没用..

有什么想法吗?

2 个答案:

答案 0 :(得分:5)

来自文档: 当timeout参数存在而不是None时,它应该是一个浮点数,指定操作的超时(以秒为单位)(或其中的分数)。由于join()始终返回None,因此必须在join()之后调用isAlive()来决定是否发生超时 - 如果线程仍处于活动状态,则join()调用超时。

答案 1 :(得分:2)

最好的方法是让线程自行关闭(因此它可以关闭打开的文件或子线程,你永远不应该“杀死”你的线程)。
join方法仅等待线程终止,它不会强制关闭 我建议您更改never_stop方法以检查时间,并在时间超过return限制后raiseX

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函数。