簡體   English   中英

如何正確關閉 Python 進程池?

[英]How to shutdown Python Process Pools properly?

我有一個用例,我必須處理一些文檔並且需要一些時間。 因此,我嘗試對文檔進行批處理並對其進行多處理,效果很好,並且按預期在更短的時間內完成。 還有處理文檔的多個階段,我在所有階段單獨使用了多處理。 當我觸發多個並發請求進行處理時,在處理了大約 70 多個請求后,我注意到一些進程沒有被殺死。

我正在用 locust 執行負載測試,我創建 5 個用戶,等待時間為 4 - 5 秒,每個請求大約需要 3.5 秒,所以我嘗試了多處理 package 和其他各種包裝器(卵石、並行執行、悲愴、並發期貨)。

我基本上做的是,

from multiprocessing import Pool

with Pool(processes=5) as p:
    out = p.starmap(do_something, args)
    p.close()
    p.terminate()

官方文檔還說,執行后將關閉池,同時with . 當我停止請求觸發時,最后一兩個請求停滯不前。 我通過在處理前后打印“Started {req_num}”和“Served {req_num}”來發現這一點。 在添加p.close()p.terminate()之前,我可以看到在停止觸發請求后正在運行更多進程。 添加它們后,僅不提供最后觸發的進程。 現在,如果我開始觸發請求並在一段時間后再次停止它們,那么最后一個或兩個請求不會得到服務,並且它們的進程停滯不前。 因此,停滯過程累積。

我提到的每個包裝器都有不同的關閉池的方式。 我也試過了。 像悲愴,

p = Pool(processes=5)
out = p.map(do_something, args)
p.join()
p.close()
p.terminate()

concurrent.future.ThreadPoolExecutor它是p.shutdown() 在所有其他包裝中,我都面臨同樣的問題。 這里停滯進程的數量比多處理中的multiprocessing.Pool 。池

我需要幫助來找到這樣做的原因或正確的方法。 任何幫助將非常感激!

要正確關閉池,只需調用:

Pool.close()  # terminate worker processes when all work already assigned has completed
Pool.join()  # wait all processes to terminate

暫無
暫無

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

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