Python multiprocessing.Process:从局部变量开始

2023-12-27

我试图理解 multiprocessing.Process 类。我想收集数据并将其异步存储在某个地方。存储数据后,它会以某种方式丢失。这是我的 MWE:

from __future__ import print_function
import multiprocessing as mp

def append_test(tgt):
    tgt.append(42)
    print('Appended:', tgt)

l = []
p = mp.Process(target=lambda: append_test(l))

p.run()
print('l is', l)

p.start()
p.join()
print('l is', l)

如果我运行该片段,我会得到

Appended: [42]
l is [42]
Appended: [42, 42]
l is [42]

正如您所看到的,调用 run 和使用 start/join 之间存在差异。它与顺序无关(之后使用运行) - 我已经尝试过了。有人可以详细说明第二个 42 是如何丢失的吗?好像是保存过一段时间的?但在其他时候却绝对不是。

以防万一这可能会产生任何影响:我尝试过 python2.7 和 python3.4,两者的结果与上述完全相同。


Update:显然,只有 start 才会产生一个新进程,随后将调用 run 。然后我的实际问题转化为以下问题:如何将 l 传递给生成的进程 s.t.我可以看到实际结果吗?


Solution:以下示例展示了如何将共享数据安全地传递给进程:

from __future__ import print_function
import multiprocessing as mp

def append_test(tgt):
    tgt.append(42)
    print('Appended:', tgt)

m = mp.Manager()
l = m.list()
p = mp.Process(target=lambda: append_test(l))

p.start()
p.join()
print('l is', l)

进一步阅读:多处理管理器文档 https://docs.python.org/2/library/multiprocessing.html#multiprocessing-managers


来自 Beazley 的《Python:基本参考》:

p.run():进程启动时运行的方法。默认情况下,这会调用传递给 Process 构造函数的目标。 ...

p.start():启动进程。这将启动代表该进程的子进程并在该子进程中调用 p.run() 。

因此,他们不应该做同样的事情。在我看来,在这种情况下,正在为正在进行的进程调用 p.run() ,并且 p.start() 在新进程中调用 p.run() ,并将原始目标传递给构造函数(其中l 仍然是[])。

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

Python multiprocessing.Process:从局部变量开始 的相关文章

随机推荐

  • 检查 python 列表/numpy ndarray 中是否存在重复项的最快方法

    我想确定我的列表 实际上是numpy ndarray 在尽可能最快的执行时间内包含重复项 请注意 我并不关心删除重复项 我只是想知道是否有重复项 注意 如果这不是重复的 我会感到非常惊讶 但我已尽力而为却找不到 最近的是这个问题 https
  • 点击外部时AngularJS下拉指令隐藏

    我正在尝试创建一个带有复选框和过滤器选项的多选下拉列表 我试图通过单击外部来隐藏列表 但不知道如何实现 感谢你的帮助 http plnkr co edit tw0hLz68O8ueWj7uZ78c http plnkr co edit tw
  • 将一种类型的切片转换为等效类型的切片的优雅方法?

    一个激励人心的例子 实施各种调度 策略 对作业列表进行排序 type Job struct weight int length int Given a slice of Jobs re order them type Strategy fu
  • 了解管道和重定向命令

    我想了解管道和重定向命令的真正威力 根据我的理解 将一个命令结果的输出作为其自身的输入 和 gt 有助于输出重定向 如果是这样 find name swp rm find name swp gt rm 为什么这个命令没有按预期工作 对我来说
  • Oracle将UNIX时间戳转换为带时区的时间戳

    尝试将 UNIX 时间戳转换为带时区的 Oracle 时间戳 期望看到不同的输出 但日期时间部分是相同的 什么是拧 select timestamp 1970 01 01 00 00 00 numtodsinterval 120410411
  • 如何在 webpack 解析器中获取文件名?

    我正在开发一个插件 该插件从模块中收集具有特定名称的导出 我已经通过解析器导出挂钩从各个文件中获取了数据 但我似乎无法找出如何提取解析器正在操作的实际模块 hook into the module factory and get the e
  • 如何使用axios发布查询参数?

    我正在尝试在 API 上发布一些查询参数 当我尝试通过邮件和名字作为查询参数传递时 这正在 PostMan Insomnia 上工作 http localhost 8000 api mails users sendVerificationM
  • 在 Mac 中运行 crontab

    我正在尝试测试一个必须由 cron 作业运行的 python 脚本 我正在尝试在我的 mac 中配置 cron 作业 但没有运行 这是我的 cron 工作 user usr local bin python3 Documents wpc s
  • VS code - 2 个拆分终端合二为一(拆分)

    当我使用 Node js 和 Angular 时 我目前使用两个终端 我必须通过下拉选项切换终端 有没有办法在同一个地方有两个终端 拆分 像这样 找不到办法 更新 Visual Studio Code 从版本 1 21 开始具有此功能 分体
  • 如何解析golang中的通用yaml并保留注释?

    我正在使用 golang yaml v3 库 目标是从带有注释的文件中解析任何 yaml 这意味着我没有预定义的结构 能够设置或取消设置结果树中的任何值并将其写回文件 然而 我遇到了相当奇怪的行为 正如您在下面的代码中看到的 如果传递给 U
  • 如何在 jQuery 中隐藏表格行?

    我有一张这样的桌子 table class headerTable tbody tr class hh td test1 td td 18 164 td tr tr class member td test3 td td 24 343 td
  • Nginx 容器:没有为证书定义“ssl_certificate_key”

    我正在尝试使用它来运行私人 docker 注册表tutorial https phoenixnap com kb set up a private docker registry 但是在我完成所有操作并运行 docker compose 后
  • 登录模型尝试登录用户而不是显示登录表单

    我已将整个代码从另一个项目移植到我的新项目Yii 1 1 12项目 它是原始的 一切都很好 在我的新项目中 尽管我在登录区域中没有触及任何内容 任何显示登录表单的尝试 或对任何操作的请求 需要用户登录 都会以Login模型尝试实际登录用户
  • java中的回车符(“\r\n”)[重复]

    这个问题在这里已经有答案了 我有一个使用java代码在unix环境中创建的文本文件 为了编写文本文件 我使用 java io FileWriter 和 BufferedWriter 对于每行后的换行符 我使用 bw write r n 方法
  • 有人发现 OSGi 在企业应用程序中很有用吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Node-js:websocket重新连接后未接收到事件

    我的 Node js 应用程序使用 bitfinex api node npm 包建立 Websocket 连接以接收来自 Bitfinex 加密货币交易所的数据 不幸的是 几个小时后连接悄然中断 应用程序停止通过 Websocket 接收
  • moment.js 在 Firefox 中给出无效日期,但在 chrome 中则不然

    我在使用 moment js 时遇到了一个奇怪的问题 我编写了一个函数将时间从 utc 转换为德国时间格式 并且一切似乎在 chrome 中都工作得很好 但现在我用 Firefox 尝试了 但这里我得到了一个无效的日期 moment loc
  • 如何监听 SQL Server 数据库更改

    使用 Net 4 0和SQL Server 2008 R2 我一直在研究利用 SqlDependency SqlNotifications 来监视某些数据库结构 将 SqlDependency SqlNotifications 与 SQL
  • ReadTimeoutError:Twitter 流 API

    我想得到一些关于攻击性狗的推文 我的关键字在代码中指定 它们都指的是德国牧羊犬 西班牙语 pastor alem n 例如 除了我希望收到的其他推文之外this one https twitter com EducaRacional sta
  • Python multiprocessing.Process:从局部变量开始

    我试图理解 multiprocessing Process 类 我想收集数据并将其异步存储在某个地方 存储数据后 它会以某种方式丢失 这是我的 MWE from future import print function import mul