multithreading killing thread after timeout - python 2.7
我正在运行一个异步程序,我启动的每一个线程,我都想要它
为了超时,如果它没有完成函数,它只会停止并杀死自己(或者其他线程会杀死它)。
1 2 3 4 5 6 7 8 | 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()并按间隔比较,即:
1 2 3 4 | def func(x, y, timeout): start = time.time() while time.time() < (start + timeout): # Do stuff |
或者添加一个函数可以每隔一段时间调用的方法,该方法将在超时时引发异常,长时间运行的函数可以在try/except块中捕获该异常以清除并退出线程:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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中的线程?