[英]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"
我假設你試圖通過一些函數調用它,這不是使用它的正確方法。
你需要用它包裹它:
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.