python多处理-重新运行初始值设定项,或在所有工作程序上运行函数?

python多处理-重新运行初始值设定项,或在所有工作程序上运行函数?,python,multiprocessing,Python,Multiprocessing,通过多处理,在创建池时,可以使用池工厂函数中的初始值设定项和initargs选项对所有工人执行相同的函数 有没有可能在保证的情况下对所有工人进行某种操作?我希望定期这样做,但我意识到这不是一个非常流行的用例,如果不基于多处理原语重新实现Pool,它可能是不可能的…如果您想要运行的与提交到Pool的任务无关,您可以简单地用您自己的版本替换Pool.Process,首先添加初始值设定项 from multiprocessing.pool import Pool as PoolCls from mul

通过多处理,在创建池时,可以使用
工厂函数中的
初始值设定项
initargs
选项对所有工人执行相同的函数


有没有可能在保证的情况下对所有工人进行某种操作?我希望定期这样做,但我意识到这不是一个非常流行的用例,如果不基于多处理原语重新实现Pool,它可能是不可能的…

如果您想要运行的与提交到Pool的任务无关,您可以简单地用您自己的版本替换
Pool.Process
,首先添加初始值设定项

from multiprocessing.pool import Pool as PoolCls
from multiprocessing import Pool, Process


class MyProcess(Process):
    def start(self):
        print 'do something you want...'
        super(MyProcess, self).start()

# use our own Process instead, should before creating pool
PoolCls.Process = MyProcess
请注意,
start()
中添加的语句在当前进程中运行,而不是在工作进程中运行。如果要在每个工作流程中运行,请覆盖
run()

只需使用确保在给定间隔后再次调用初始值设定项即可

这是一种定期重新安排操作的标准方法

from threading import Timer
from multiprocessing import Pool

def initializer(interval: float):
    update_global_state()

    timer = Timer(interval, initializer, args=[interval])
    timer.start()

pool = Pool(initializer=initializer, initargs=[STATE_UPDATE_INTERVAL])
池的每个worker将定期独立地更新其状态

编辑:

Pool
设计范式的目标是抽象任务和工作人员的管理,将主循环与作业的执行分离。在这样做的同时,它限制工人的访问,以保护整体逻辑

如果您需要的是在工作人员之间共享和更新状态,那么唯一可行的方法是让工作人员对状态更新进行投票。您可以使用上述方法,也可以让工作人员检查任何新作业的状态


由于
在设计上是异步的,因此无法同步地向工作人员提供信息

请更好地解释你想要实现的目标。“有保证地运行某件事情”是什么意思?池可以有
map
map\u async
或用于提交待完成作业的应用变量。例如,如果我有一个4进程池并提交了4个作业,就不能保证所有4个进程都完成了。因此,我不能重复工作
num_进程
次,并且每次都让程序工作。我使用一个池来处理一些只读全局状态(类似于值对象,但没有锁的惩罚)。我希望定期更新全局状态,而不破坏池并创建新池。所谓“定期”,我的意思是“按需”——因此产卵/生产者过程将向每个工人发送一个信号。我想要
p=Pool(…);p、 映射(func,[args]);p、 在所有工人(func、args)上运行从父进程中,您没有简单的方法来确保在发送信号时工人不会忙,这意味着您可能会在工人之间出现不一致的状态。最安全的方法是等待工人空闲并更新状态。虽然这与使用更新状态重新创建新池没有太大区别。在windows上,当池生成时,所有的
\uuuu main\uuuu
都会在每个工作线程上重新运行,这可能会非常昂贵。我相信,如果您只使用pool.map来分发工作,那么状态就不会不同步。