簡體   English   中英

Python多處理,在循環中多次使用池在第一次迭代后被卡住

[英]Python multiprocessing, using pool multiple times in a loop gets stuck after first iteration

我有以下情況,我在for循環中創建一個池如下(我知道它不是很優雅,但我必須這樣做,因為酸洗的原因)。 假設pathos.multiprocessing等同於python的multiprocessing庫(因為它取決於一些與此問題無關的細節)。 我有以下代碼要執行:

self.pool = pathos.multiprocessing.ProcessingPool(number_processes)


for i in range(5):


    all_responses = self.pool.map(wrapper_singlerun, range(self.no_of_restarts))

    pool._clear()

現在我的問題:循環成功運行第一次迭代。 然而,在第二次迭代中,算法突然停止(沒有完成pool.map操作。我懷疑生成了僵屍進程,或者進程以某種方式switched 。下面你將找到我迄今為止嘗試過的所有內容。

for i in range(5):

    pool = pathos.multiprocessing.ProcessingPool(number_processes)

    all_responses = self.pool.map(wrapper_singlerun, range(self.no_of_restarts))

    pool._clear()

    gc.collect()

    for p in multiprocessing.active_children():
        p.terminate()
        gc.collect()

    print("We have so many active children: ", multiprocessing.active_children()) # Returns []

上面的代碼在我的mac上運行得非常好。 但是,當我將其上載到具有以下規范的群集上時,我會收到第一次迭代后卡住的錯誤:

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04 LTS"

這是pathos '多處理庫文件的鏈接

我假設你試圖通過一些函數調用它,這不是使用它的正確方法。

你需要用它包裹它:

if __name__ == '__main__':
    for i in range(5):

         pool = pathos.multiprocessing.Pool(number_processes)

         all_responses = pool.map(wrapper_singlerun, 

range(self.no_of_restarts))

如果你不這樣做,它將繼續創建自己的副本,並將開始將其放入堆棧,最終將填充堆棧並阻止所有內容。 它在mac上運行的原因是它有fork而windows沒有它。

暫無
暫無

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

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