关于超线后多线程查杀线程: – python 2.7

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中的线程?