我正在使用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