如何为线程设置超时时间?

17

我正在使用 threading.Thread 来实现我的代码多线程化。 如果至少有 1 个线程在 X 秒内没有完成工作,我想要捕获 Timeout exception。 我在这里找到了一些答案,描述了如何处理这个问题,但大部分都是适用于 UNIX 系统,而我正在使用 Windows 平台。

示例代码:

from threading import Thread
from time import sleep

def never_stop():
    while True:
        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个回答

12
文档中得知:
当存在timeout参数且不为None时,它应该是一个浮点数,用于指定操作的超时时间(以秒或其分数表示)。由于join()始终返回None,因此您必须在join()之后调用isAlive()来确定是否发生了超时-如果线程仍然活着,则join()调用已超时。

7
如果线程在加入超时后仍然存活,那么如何终止该线程? - Hillary Sanders
1
@HillarySanders 到了2023年,这个问题仍然没有得到解决。 - 71GA
1
在Thread构造函数中设置daemon=True可以解决这个问题。 - Carlos Souza

6

最好的方式是使线程自己关闭(这样可以关闭打开的文件或子线程,您不应该“杀死”线程)。
join 方法只等待线程终止,它不会强制关闭线程。
我建议将您的 never_stop 方法更改为检查时间,并在时间超过 X 限制时 returnraise

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接