我正在使用Python 2.7。Python中ThreadPool中每个线程的超时
我目前使用ThreadPoolExecuter这样的:
params = [1,2,3,4,5,6,7,8,9,10]
with concurrent.futures.ThreadPoolExecutor(5) as executor:
result = list(executor.map(f, params))
问题是f
有时运行时间过长。每当我运行f
,我想限制它的运行到100秒,然后杀死它。
最终,对于x
param
中的每个元素,我想指出是否必须杀死f
,如果不是 - 返回值是多少。 即使f
超时一个参数,我仍然想运行它与下一个参数。
executer.map
方法确实有一个timeout
参数,但它为整个运行设置了一个超时时间,从调用时间到executer.map
,而不是分别为每个线程。
什么是最简单的方法来获得我想要的行为?
没有直接的方法来杀死Python中的线程。如果传递给map的timeout超时,它不会实际终止执行程序线程,它只会使'future.result(timeout)'调用它在内部引发'TimeoutError'异常。虽然,工作线程将继续在后台运行。如果您需要线程实际被终止,您需要让您的工作人员函数检查父代在超时过期后可以设置的某种标志。然而,这可能并不容易实现,这取决于工作人员功能在做什么。 – dano 2014-09-22 14:35:21
@dano:我明白了。仍然在后台运行的过程是我可能能够忍受的事情。但让我们说线程处理参数[4]卡住了,我仍然可以得到处理params [5]的参数params [9]的结果吗? – user302099 2014-09-22 15:32:41
@ user302099:如果在'params [4]'之前准备好了,你可以使用'as_completed()'而不是'map()'来得到'params [5]'结果。如果你使用线程,那么函数应该配合(尊重退出条件)。如果你不能依赖这个函数来行为,那么就使用进程。 – jfs 2014-09-22 15:52:41