如何设置线程超时? [复制]
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
限制时更改return
或raise
:
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 脚本;如何避免超时?