Python多進程:超時進程的處理與終止

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]與我交流討論~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章