如何设置线程超时?

Dan*_*Dan 5 python windows multithreading timeout python-2.7

我正在使用threading.Thread多线程代码。我想Timeout exception知道至少有1个线程没有在X秒内完成工作。我在这里找到了一些答案,描述了如何解决该问题,但是大多数答案都与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)
Run Code Online (Sandbox Code Playgroud)

我试图在该join方法中设置超时,但没有用。

有任何想法吗?

小智 6

最好的方法是让线程自行关闭(这样它就可以关闭打开的文件或子线程,你永远不应该“杀死”你的线程)。
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
Run Code Online (Sandbox Code Playgroud)

这样你的线程将在X几秒后自行结束,你甚至可以在创建线程时传递 X 作为参数:

def never_end(X):
    # rest stays the same, except for the X = 2


t1 = threading.Thread(target=never_stop, args=(2,))
Run Code Online (Sandbox Code Playgroud)

args是一个元组,它的内容将作为参数传递给target函数。


小智 5

从文档中:

如果timeout存在该参数而没有该参数None,则它应该是一个浮点数,以秒为单位(或其秒数)指定操作的超时时间。与join()往常一样None,您必须isAlive()在之后调用join()以确定是否发生了超时–如果线程仍然存在,则join()调用超时。

  • 那么如果连接超时后线程仍然存活,如何杀死该线程呢? (8认同)