[英]How to pass the “lock” in my concurrent.futures.ProcessPoolExecutor in Python?
[英]Shared variable in concurrent.futures.ProcessPoolExecutor() python
我想使用并行更新全局变量,使用 python 中的模块 concurrent.futures
事实证明,使用 ThreadPoolExecutor 可以更新我的全局变量,但 CPU 并没有充分利用它们的潜力(总是在 5-10%),这太慢了
和 ProcessPoolExecutor 可以使用所有核心(100%),但我的全局变量无法更新,因为它们不共享相同的全局变量
如何在 concurrent.futures model 中使用 ProcessPoolExecutor 共享我的全局变量。非常感谢您的帮助
进程看起来不像使用相同 memory 空间的线程。 所以你需要一些特殊的方法来更新变量。 ProcessPoolExecutor
使用了multiprocessing
模块,共享数据有Shared memory和Server process两种方式。 第一种方式使用共享 memory map,服务器进程使用Manager
object 像代理一样保存共享数据。 服务器进程更灵活,共享memory更高效。
使用服务器进程共享数据,如ThreadPoolExecutor
,只需将 arguments 传递给您 function。
def running_proxy(mval):
# consider lock if you need
return mval.value
def start_executor():
with multiprocessing.Manager() as manager:
executor = ProcessPoolExecutor(max_workers=5)
mval = manager.Value('b', 1)
futures = [executor.submit(running_proxy, mval) for _ in range(5)]
results = [x.result() for x in futures]
executor.shutdown()
但是Shared memory方式有些区别,需要将shared变量设置为全局。
def running_shared():
# consider lock if you need
return sval.value
def set_global(args):
global sval
sval = args
def start_executor():
sval = multiprocessing.Value('b', 1)
# for 3.7+
executor = ProcessPoolExecutor(max_workers=5, initializer=set_global, initargs=(sval,))
# for ~3.6
# set_global(sval)
# executor = ProcessPoolExecutor(max_workers=5)
futures = [executor.submit(running_shared) for _ in range(5)]
results = [x.result() for x in futures]
executor.shutdown()
我想在 python 中使用模块 concurrent.futures 使用并行更新全局变量
事实证明,使用 ThreadPoolExecutor 可以更新我的全局变量,但 CPU 并没有充分利用它们的潜力(总是在 5-10%),这太慢了
和 ProcessPoolExecutor 可以使用所有核心(100%)但我的全局变量无法更新,因为它们不共享相同的全局变量
如何在 concurrent.futures model 中使用 ProcessPoolExecutor 共享我的全局变量。 非常感谢您的帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.