我正在运行一个异步程序,我开始的每个线程,我都希望它
有一个超时,如果它没有完成该功能,它将停止并自杀(或其他一些线程会杀死它)
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
谢谢!
答案 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?