在 Python multiprocessing.Pool 中共享可变全局变量

2023-12-03

我正在尝试更新共享对象(dict)使用以下代码。但这不起作用。它给了我输入dict作为输出。

Edit:Exxentially,我在这里想要实现的是将数据(列表)中的项目附加到字典的列表中。数据项给出字典中的索引。

预期产出: {'2': [2], '1': [1, 4, 6], '3': [3, 5]}
注意:方法 2 会引发错误TypeError: 'int' object is not iterable

  1. 方法一

    from multiprocessing import *
    def mapTo(d,tree):
            for idx, item in enumerate(list(d), start=1):
                tree[str(item)].append(idx)
    
    data=[1,2,3,1,3,1]
    manager = Manager()
    sharedtree= manager.dict({"1":[],"2":[],"3":[]})
    with Pool(processes=3) as pool:
        pool.starmap(mapTo, [(data,sharedtree ) for _ in range(3)])
    
  2. 方法2
 from multiprocessing import *
 def mapTo(d):
         global tree
         for idx, item in enumerate(list(d), start=1):
             tree[str(item)].append(idx)

 def initializer():
      global tree
      tree = dict({"1":[],"2":[],"3":[]})
 data=[1,2,3,1,3,1]
 with Pool(processes=3, initializer=initializer, initargs=()) as pool:
     pool.map(mapTo,data)```

如果您希望反映更改,则需要使用托管列表。所以,以下内容对我有用:

from multiprocessing import *
def mapTo(d,tree):
        for idx, item in enumerate(list(d), start=1):
            tree[str(item)].append(idx)

if __name__ == '__main__':
    data=[1,2,3,1,3,1]

    with Pool(processes=3) as pool:
        manager = Manager()
        sharedtree= manager.dict({"1":manager.list(), "2":manager.list(),"3":manager.list()})
        pool.starmap(mapTo, [(data,sharedtree ) for _ in range(3)])

    print({k:list(v) for k,v in sharedtree.items()})

这是输出:

{'1': [1, 1, 1, 4, 4, 4, 6, 6, 6], '2': [2, 2, 2], '3': [3, 3, 5, 3, 5, 5]}

请注意,您应该始终使用if __name__ == '__main__':使用多处理时要注意,还要避免加星号的导入......

Edit

如果您使用的是 Python mapTo:

def mapTo(d,tree):
        for idx, item in enumerate(list(d), start=1):
            l = tree[str(item)]
            l.append(idx)
            tree[str(item)] = l

最后,你没有使用starmap/map正确的是,您传递了三次数据,所以当然,所有内容都会被计算三次。映射操作应该适用于您要映射的数据的每个单独元素,因此您需要如下所示的操作:

from functools import partial
from multiprocessing import *
def mapTo(i_d,tree):
    idx,item = i_d
    l = tree[str(item)]
    l.append(idx)
    tree[str(item)] = l

if __name__ == '__main__':
    data=[1,2,3,1,3,1]

    with Pool(processes=3) as pool:
        manager = Manager()
        sharedtree= manager.dict({"1":manager.list(), "2":manager.list(),"3":manager.list()})
        pool.map(partial(mapTo, tree=sharedtree), list(enumerate(data, start=1)))

    print({k:list(v) for k,v in sharedtree.items()})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Python multiprocessing.Pool 中共享可变全局变量 的相关文章

随机推荐

  • BigDecimal 在与浮点数转换时不保留舍入值[重复]

    这个问题在这里已经有答案了 我有一个使用 BigDecimal setScale 将浮点数四舍五入到 n 位数字的函数 private float roundPrice float price int numDigits BigDecima
  • PHP 函数和包含的脚本中未定义的变量

    我已经阅读了很多关于这个问题的文章 但是我仍然无法解决它 在我的函数文件中 我声明了一个具有如下值的变量 px host localhost 我有一个数据库查询功能 如下所示 function dbQuery database reqque
  • 具有相同实体和存储库的多个数据源

    目前正在做一个项目 我的 Spring Boot 项目需要 在同一数据库服务器中利用多个数据源或模式 我有 找到了几个教授多数据源配置的教程 spring boot 其中实体 foo 存在于数据源 A 中 而 bar 存在于 数据源B如下所
  • 扩展命令提示符的环境变量

    我想运行一个 cmd exe 它会在调用时而不是在解析命令时评估环境变量 如果我将 BASE 设置为 2 并回显它 我应该会看到数字 2 尽管运行此脚本无法正确设置基数 预期行为 C Users schristo gt cmd exe X
  • 如何从 ASP.Net MVC 列表页面使用 jQuery UI 模态表单

    我正在尝试使用这个 http jqueryui com demos dialog modal form I have
  • 从数据库获取自动编号值

    代码如下 在我的代码中 我更新现有行 从现有表 程序从文本框中获取所有更新的值 表的末尾 最后一列 有一个名为 codonsAutoNum 的自动编号字段 我不知道如何从数据库获取值 自动编号值 我需要 在代码中 有 的位置的值 感谢大家的
  • ES6 生成器 - 第一个 next() 没有 Yield 表达式的示例

    对于 ES6 生成器 为什么作者这篇博文 say from http davidwalsh name es6 generators 第一个 next 调用 我们不发送任何内容 为什么 因为没有yield 表达式来接收我们传入的内容 不是第一
  • 消息:使用 selenium python 发送密钥 [search_bar.send_keys(course_name)] 到 Youtube 搜索栏时元素不可交互错误

    我尝试了 StackOverflow 的大部分解决方案 但对我不起作用 我正在尝试使用 selenium python 将一些课程名称发送到 youtube 搜索栏 它以前工作正常 但现在在执行此操作时出现此错误 search bar se
  • Azure AD 重定向 URI 从 https 更改为 http

    Overview 我在 Azure AD 门户注册了一个应用程序 重定向机制在开发过程中一直运行良好 但 Oauth 重定向 URI 上发生了奇怪的转换 客户端应用程序是使用 Django 框架并使用 MSAL for Python 库构建
  • 防止 UISearchDisplayController 隐藏导航栏

    每当用户开始编辑UISearchDisplayController的搜索栏 搜索控制器将变为活动状态 并在显示搜索表视图时隐藏视图的导航栏 是否可以预防UISearchDisplayController隐藏导航栏而不重新实现它 我刚刚对 U
  • 检查 varchar2 中声明的有效日期

    我的表如下所示 在 VARCHAR2 中声明 YMD 20101010 20101112 20100231 20150101 20160101 我必须检查有效日期并从 sysdate 中过滤未来日期 这些日期的格式有效 我编写如下函数来检查
  • 如何在 Struts 2 中创建一个 Action 来接受来自用户界面的动态 JSON 数据?

    我想要一个Action类应该接受从用户界面构造的 JSON 字符串 其中没有 setter 和 getterAction class 是否可以 如果是这样 我需要遵循哪些约定Action类和配置文件中 struts xml 将它们发布为带有
  • 最通用的高阶约束,描述相对于关系排序的整数序列

    在 CLP FD 中 我们经常需要声明 这是整数和有限域变量的列表 有时 strictly 升序 降序 是否有任何 CLP FD 系统为此任务提供通用 可参数化 内置约束 SWI Prolog 提供了一个称为chain 2 这与我正在寻找的
  • 如何在 Jackson 中反序列化多个嵌套元素?

    我需要构建一个解析器来解析XML文件到一个Java目的 我用Jackson为此 请按照中提供的步骤操作THIS教程 在教程中有一节 操作 XML 中的嵌套元素和列表 我遵循了它 但不幸的是我无法获得所有所需元素的所需输出 我想输出所有作者的
  • 转到特定路线的 div 元素

    我有两条路线 从一条路线我需要通过单击按钮获取另一条路线的 div 元素 我做了类似的方式id 我们在 HTML 中这样做 但它不起作用 你能建议一个在 Angular 中做的最好的方法吗 一号公路 route1 div class div
  • RESTAssured 禁用 URL 编码无法正常工作

    我正在使用如下 URL 测试 HTTP Post 请求 https myurl com api logs 2Fvar 2flogin 2f 消息 Api Token 12332429nmdsafs 我禁用了 URL 编码 这里是我的发布请求
  • 检查机器中安装的模块列表

    我制作了一个脚本来告知管理员需要在计算机上安装的模块列表 我正在尝试检查模块是否通过下面的代码安装 奇怪的是 它显示机器中已安装的模块为not installed usr bin perl w my module list Smart Co
  • 如何使用带有预填充数据库的房间持久性库?

    我想将 Room 与预填充的数据库一起使用 但我不明白如何告诉 Room 在哪里可以找到我的数据库 我现在已经把它放进去了src main assets databases当我为 Room 数据库创建实例时 我这样创建 Room datab
  • Android:从资产文件夹复制数据库 (Sqliite) 时出错

    我在 SQLite 浏览器中设计了数据库 现在我正在尝试将其复制到我的根路径 面临的问题 复制数据库时出错 LINK 我从这个例子中得到帮助 将外部 Sqlite Db 添加到应用程序的链接 我的 DBhelper 类 package co
  • 在 Python multiprocessing.Pool 中共享可变全局变量

    我正在尝试更新共享对象 dict 使用以下代码 但这不起作用 它给了我输入dict作为输出 Edit Exxentially 我在这里想要实现的是将数据 列表 中的项目附加到字典的列表中 数据项给出字典中的索引 预期产出 2 2 1 1 4