作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
语境:
concurrent.futures.process.ProcessPool
的 Python 应用程序服务器执行代码 importlib.reload
有
caveats)
importlib.reload
在每个
multiprocessing
由进程池管理的进程。
最佳答案
我不知道这将如何与您提到的热重新加载尝试有关,但是您真正提出的一般问题是可以回答的。
Is there a way to submit something to all processes in a process pool?
something
一次且仅一次,在每个进程都得到它之前不会进一步执行。
multiprocessing.Barrier(parties[, action[, timeout]])
的帮助下获得此类必要的同步。 .屏障将阻止各方调用
barrier.wait()
直到每一方都这样做,然后立即释放它们。
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))))
示例输出:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
ForkProcess-3 --- reloading something and waiting.
ForkProcess-2 --- reloading something and waiting.
ForkProcess-1 --- reloading something and waiting.
ForkProcess-4 --- reloading something and waiting.
ForkProcess-1 --- released.
ForkProcess-4 --- released.
ForkProcess-3 --- released.
ForkProcess-2 --- released.
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Process finished with exit code 0
如果您同意保留
barrier
全局和
multiprocessing.get_context()._name
返回
"fork"
,您不需要使用
initializer
因为全局变量将通过 fork 被继承和访问。
关于python - 提交代码以执行到 concurrent.futures.ProcessPool 中的所有进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64392998/
语境: 使用 concurrent.futures.process.ProcessPool 的 Python 应用程序服务器执行代码 我们有时想在不重启整个服务器进程的情况下热重载导入的代码 (是的,
我有一个 react 器,它从 RabbitMQ 代理获取消息并触发工作方法以在进程池中处理这些消息,如下所示: 这是使用 python asyncio、loop.run_in_executor()
我是一名优秀的程序员,十分优秀!