远程进程数未知的python多进程屏障

2024-06-25 06:52:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Manager对象在集群上运行多进程,我想设置一个屏障来同步所有进程,但我不知道在集群中会生成多少进程(我的客户机进程使用一些逻辑来确定基于可用CPU和ram生成多少进程)。你知道吗

由于我是通过子类化BaseManager并在创建管理器之前向类注册Barrier对象来设置管理器的(根据文档中的示例),所以在实例化Barrier时,我必须指定参与方的数量,但我不知道参与方的总数。你知道吗

barrier = threading.Barrier(parties=?)
class ClusterManager(BaseManager): pass
ClusterManager.register('get_barrier', callable=lambda:barrier)
manager = ClusterManager(etc etc)

我真正想要的是能够创建一个Barrier对象(具有任意数量的parties),然后在我知道有多少远程进程已经启动之后更改parties属性,但是如果我尝试使用内置Barrier对象(例如barrier.parties += 1),我会得到AttributeError: can't set attribute。你知道吗

我目前的黑客解决方案是使用一个Queue对象,并让每个远程进程启动一次,每次在队列中放入一些东西,因此qsize等于进程总数。然后我使用task_done并加入队列中的调用来实现我的同步点。不幸的是,这种方法有很多种失败的方法。你知道吗

有没有更好的方法来实现我想要的,最好只使用标准库?你知道吗


Tags: 对象方法管理器数量远程进程etc集群