超时后多线程查杀线程 - python 2.7

时间:2016-03-23 11:45:38

标签: python multithreading time timeout

我正在运行一个异步程序,我开始的每个线程,我都希望它

有一个超时,如果它没有完成该功能,它将停止并自杀(或其他一些线程会杀死它)

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

谢谢!

1 个答案:

答案 0 :(得分:1)

杀死线程是一种不好的做法,对于长时间运行的函数来说,检查状态标志并退出自身更好,而不是突然杀死线程的外部因素。一个简单的检查,用time.time()记录函数调用的开始时间,并按间隔进行比较,即:

 [ValueConversion(typeof(bool?), typeof(bool))]
public class InverseBooleanConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (targetType != typeof(bool?))
        {
            throw new InvalidOperationException("The target must be a nullable boolean");
        }
        bool? b = (bool?)value;
        return b.HasValue && !b.Value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return !(value as bool?);
    }

    #endregion
}

或添加一个方法,该函数可以在超出超时时引发异常的时间间隔调用,以便长时间运行的函数可以在try / except块中捕获以清理并退出该线程:

def func(x, y, timeout):
    start = time.time()
    while time.time() < (start + timeout):
        # Do stuff

我会推荐这个帖子作为一个好读物:Is there any way to kill a Thread in Python?