我正在运行一个异步程序,我启动的每个线程,我都希望它是
有一个超时,如果它没有完成功能,它将停止并杀死自己(或者其他线程会杀死它)
func(my_item, num1, num2, num3, timeout):
calc = num1+num2
# something that takes long time(on my_item)
for item in my_list:
if item.bool:
new_thread = threading.Thread(target=func, (item, 1, 2, 3, item.timeout))
new_thread.start()
现在我希望主线程继续启动新线程,但我也希望每个线程都有一个超时,这样线程就不会永远继续下去。
我使用的是windows而不是UNIX,所以我无法运行SINGLRM
谢谢!
杀死线程是一种糟糕的做法,对于长期运行的函数来说,最好检查状态标志并退出它自己,而不是由外部因素突然杀死线程。一个简单的检查,用time.time()记录函数调用的开始时间,并每隔一段时间进行比较,即:
def func(x, y, timeout):
start = time.time()
while time.time() < (start + timeout):
# Do stuff
或者添加一个方法,该函数可以每隔一段时间调用该方法,当超过超时时会引发一个异常,您的长时间运行的函数可以在try/except块中捕获该超时以清理并退出线程:
def check_timeout(start_time, timeout):
if time.time() > (start_time + timeout):
raise TimeoutException
try:
# Stuff
check_timeout(start_time, timeout)
# Bit more stuff
check_timeout(start_time, timeout)
# Bit more stuff
check_timeout(start_time, timeout)
# Bit more stuff
# All done!
return "everything is awesome"
except TimeoutException:
# Cleanup and let thread end
我推荐这个线程作为一本好书:有什么方法可以杀死Python中的线程吗?