繁体   English   中英

concurrent.futures.ProcessPoolExecutor() 中的共享变量 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM