首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Multiprocessing和Pool访问全局变量?

如何使用Multiprocessing和Pool访问全局变量?
EN

Stack Overflow用户
提问于 2017-05-03 01:49:10
回答 2查看 12.3K关注 0票数 5

我试图避免将变量冗余地传递到dataList (例如,[(1, globalDict), (2, globalDict), (3, globalDict)]),而是在全局使用它们。但是,在下面的代码中,global globalDict不是这样做的解决方案。

是否有一种直接的方法来访问多处理函数中的数据?

我阅读了以下这里

通信是昂贵的。与线程之间的通信相比,在进程之间交换数据要昂贵得多。在中,数据在管道上传输之前被筛选成二进制格式。因此,当任务较小时,通信开销可能非常大。为了降低额外的成本,最好用块分配任务。”

我不确定这是否适用于这里,但无论如何,我想简化数据访问。

代码语言:javascript
运行
复制
def MPfunction(data):
    global globalDict

    data += 1

    # use globalDict

    return data

if __name__ == '__main__':

    pool = mp.Pool(mp.cpu_count())

    try:
        globalDict = {'data':1}

        dataList = [0, 1, 2, 3]
        data = pool.map(MPfunction, dataList, chunksize=10)

    finally:
        pool.close()
        pool.join()
        pool.terminate()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-03 02:31:25

在Linux上,multiprocessing分叉一个新的进程副本来运行池工作人员。该进程具有父内存空间的副本写入视图。只要在创建池之前分配globalDict,它就已经存在了。请注意,对该数据集的任何更改都将保留在子节点中。

在Windows上,创建了python的一个新实例,所需的状态在子程序中被腌制/解除了。在创建池并在其中复制时,可以使用初始化函数。这是每个子进程一个副本,比每个项目映射一次更好。

(顺便说一句,在创建池之后启动try块,这样您就不会引用坏的池对象,如果这会引发错误)

代码语言:javascript
运行
复制
import platform

def MPfunction(data):
    global globalDict

    data += 1

    # use globalDict

    return data

if platform.system() == "Windows":
    def init_pool(the_dict):
        global globalDict
        globalDict = the_dict

if __name__ == '__main__':
    globalDict = {'data':1}

    if platform.system() == "Windows":
        pool = mp.Pool(mp.cpu_count, init_pool(globalDict))
    else:
        pool = mp.Pool(mp.cpu_count())

    try:
        dataList = [0, 1, 2, 3]
        data = pool.map(MPfunction, dataList, chunksize=10)
    finally:
        pool.close()
        pool.join()
票数 11
EN

Stack Overflow用户

发布于 2022-08-24 18:20:56

如果要在进程之间共享的所有对象都是只读的,则可以在主线程(父进程)中将这些对象声明为全局变量,并将它们与子进程共享为参数。

代码语言:javascript
运行
复制
from multiprocessing import Process

if __name__ == '__main__':
    global number
    number = 1000
    p = Process(target=my_method, args=(number))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43749801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档