如何设置线程超时? [复制]

Posted

技术标签:

【中文标题】如何设置线程超时? [复制]【英文标题】:How to set timeout to threads? [duplicate] 【发布时间】:2016-06-03 13:46:35 【问题描述】:

我正在使用threading.Thread 对我的代码进行多线程处理。 如果至少有 1 个线程没有在 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 方法中设置超时但没用..

有什么想法吗?

【问题讨论】:

【参考方案1】:

来自documentation:

timeout 参数存在而不是None 时,它应该是一个浮点数,以秒(或其分数)指定操作超时。由于join() 总是返回None,因此您必须在join() 之后调用isAlive() 来确定是否发生超时——如果线程还活着,则join() 调用超时。

【讨论】:

那么如果线程在join超时后仍然存活,你如何杀死线程呢?【参考方案2】:

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

【讨论】:

以上是关于如何设置线程超时? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何超时等待“输入”? [复制]

requests.post 可以在慢速(但不是死)连接上超时吗? [复制]

如何在由于库函数而挂起的函数上实现超时? [复制]

用于复制整个 Google Drive 文件结构的 Google Apps 脚本;如何避免超时?

如何使 WebSphere Application Server 上长时间运行的 Web 请求超时? [复制]

TimesTen 数据库复制学习:6. 利用STORE关键字设定复制网络传输的属性