import multiprocessing as mp
from concurrent.futures import ProcessPoolExecutor
def foo(x):
for _ in range(int(42e4)):
pass
return x
def reload(something):
print(f"{mp.current_process().name} - reloading {something} and waiting.")
barrier.wait()
print(f"{mp.current_process().name} - released.")
def init_barrier(barrier):
globals()['barrier'] = barrier
if __name__ == '__main__':
MAX_WORKERS = 4
barrier = mp.Barrier(MAX_WORKERS)
with ProcessPoolExecutor(
MAX_WORKERS, initializer=init_barrier, initargs=(barrier,)
) as executor:
print(list(executor.map(foo, range(10))))
# then something for all processes
futures = [executor.submit(reload, "something") for _ in range(MAX_WORKERS)]
for f in futures:
f.result()
print(list(executor.map(foo, range(10))))
我不知道你提到的热重新加载尝试会怎样,但是你真正问的一般问题是可以回答的
这里的挑战在于确保所有进程都能得到这个
something
一次,而且只有一次,并且在每个进程都得到它之前,不会再执行您可以在^{} 的帮助下获得这种必要的同步。屏障将阻止调用
barrier.wait()
的各方,直到各方都这样做,然后立即释放它们示例输出:
如果您可以保留
barrier
一个全局变量,并且multiprocessing.get_context()._name
返回"fork"
,则不需要使用initializer
,因为全局变量将通过分叉继承和访问相关问题 更多 >
编程相关推荐