我有以下情况,我在一个循环中创建池,如下所示(我知道这不是非常优雅,但我必须为选取原因而这样做)。假设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
操作)。我怀疑产生了僵尸进程,或者进程被某种方式切换
了。下面是到目前为止我所尝试过的所有方法。
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的多进程库文件。
pathos
的作者。pathos.multiprocessing
提供了一个增强版的Pool
,体现在两个方面:(1)更好的序列化方式,(2)更好的初始化方法。如果你只是想要更好的序列化方式,我建议你使用pathos.pools._ProcessPool
,它具有与multiprocessing
完全相同的接口和规范,但序列化方式更好。如果你还在寻找pathos
的其他特性,那么你应该知道,pathos
池会一直保留,除非显式地销毁。你需要在上面使用的池上执行pool._clear
或pool.restart
来杀死(或重新启动)池。 - Mike McKernspathos.multiprocessing
中的接口已被弃用,推荐使用pathos.pools.ProcessPool
接口。该池应该有一个_clear
和一个restart
方法。请注意,这是与pathos.multiprocessing.ProcessPool
和pathos.multiprocessing.ProcessingPool
相同的对象...我将它们保留下来以保持向后兼容性。 - Mike McKernsclear
来关闭每个Pool
来测试该理论。这将限制活动进程的数量。您可以尝试使用ProcessPool(1)
或类似的东西。 - Mike McKerns