Python多進程:超時進程的處理與終止
簡介: 平時的工作中經常需要使用多進程去求解微分方程去模擬系統演化或者通過優化方法去尋找最優解,上述的工作中經常用到Python的多進程Multiprocess。在使用這一功能的時候,我經常遇到某個進程長時間沒有結束,可能是在求解的時候陷入了無盡的循環,所以我引入可超時終止的多進程方法。
關鍵詞: Python多進程, Multiprocess, 超時, 子進程,Timeout
基本思想
我們希望當程序運行的時候,最好有一個監視者可以監視每一個進程,一旦某個進程超時,我們的監視者就可以對它進行處理。那麼誰來充當監視者呢?守護進程最好不過了。
基本操作
將現有的worker函數封裝在另一個函數中,使其成爲守護進程中的worker。等待該進程的結果,如果超時則進行處理。
import multiprocessing
from multiprocessing.dummy import Pool as ThreadPool
from functools import partial
def worker(x, y, z):
pass # Do whatever here
def collectMyResult(result):
print("Got result {}".format(result))
def abortable_worker(func, *args, **kwargs):
timeout = kwargs.get('timeout', None)
p = ThreadPool(1)
res = p.apply_async(func, args=args)
try:
out = res.get(timeout) # Wait timeout seconds for func to complete.
return out
except multiprocessing.TimeoutError:
print("Aborting due to timeout")
raise
if __name__ == "__main__":
pool = multiprocessing.Pool(maxtasksperchild=1)
featureClass = [[1000,k,1] for k in range(start,end,step)] #list of arguments
for f in featureClass:
abortable_func = partial(abortable_worker, worker, timeout=3)
pool.apply_async(abortable_func, args=f,callback=collectMyResult)
pool.close()
pool.join()
參考資料:
StackOverFlow:How can I abort a task in a multiprocessing.Pool after a timeout?
歡迎郵件至[email protected]與我交流討論~