簡體   English   中英

Python多處理:如何在異常時關閉多處理池

[英]Python multiprocessing: How to close the multiprocessing pool on exception

我正在使用python多處理來拆分一個較長的進程並並行運行。 它工作正常,除非其中一個子進程有異常,在這種情況下,進程池沒有關閉,我仍然可以在服務器上看到這些進程。

這是代碼:

from multiprocessing import Pool
pool = Pool(processes=4)
from functools import partial
param_data = "Test Value"
func = partial(test_function, param_data)
r = pool.map(func, range(3))
pool.close()

def test_function(param_data,index):
   try:
      # The process here;
   except Exception as e:
      # Close the process pool;

在給出了除了塊之外的pool.close

NameError:未定義全局名稱“池”

我嘗試使用以下代碼終止Exception上的進程。

    except Exception as e:
       import os
       import signal
       pid = os.getpid()
       os.kill(pid, signal.SIGTERM) 

但我仍然可以在服務器上看到這個過程。 這仍然不是最好的解決方案,因為這只會終止遇到異常的子進程,其他進程仍然會繼續。

我希望所有進程在完成時終止,無論它們是否遇到異常。

我正在運行Python2.7

Ps:我無法在服務器上安裝像psutil這樣的新庫,我正在嘗試使用標准python庫的解決方案。

我在這個論壇上檢查了幾個類似的問題,比如自動殺戮過程和孩子 ,但他們並不是真的這個問題。

我得到了解決方案 - 在父進程中捕獲異常。

try:
   pool = Pool(processes=4)
   from functools import partial
   param_data = "Test Value"
   func = partial(test_function, param_data)
   r = pool.map(func, range(3))
except Exception as e:
   pool.close()
pool.close()

並在子進程函數中添加try / catch:

def test_function(param_data,index):
    try:
       # The process here;
    except Exception as e:
       raise Exception(e.message)          

這里的except塊看起來多余,但事實並非如此。 原因是,子進程引發的一些異常並沒有拋給父進程。

例如,我在函數中引發了一個自定義異常並且沒有拋出到父進程,因此建議捕獲子進程中的所有異常並從那里引發標准異常,然后在父進程處理它,其中您可以關閉進程池或進行其他清理。

您必須在Pool.terminate和Pool.join之后使用:del Pool

這將解決您的問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM