我正在使用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并加入队列中的调用来实现我的同步点。不幸的是,这种方法有很多种失败的方法。你知道吗
有没有更好的方法来实现我想要的,最好只使用标准库?你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐