【问题标题】:Multiprocessing Shared Variables多处理共享变量
【发布时间】:2019-12-11 15:21:57
【问题描述】:

虽然这个问题看起来很重复,但我绝对不知道我做错了什么。

下面的例子provided by Python docsmany others I have tried,完全忽略了目标函数变量设置。

我使用 Jupyter Notebook 和 Windows 在 Python 3.7.3 上运行它。但我在使用 Linux 时也遇到了同样的问题。

我不知道发生了什么,看起来有一些额外的配置可以在进程之间共享状态。

from multiprocessing import Process, Value, Array

def f(n, a):
    n.value = 3.1415927
    for i in range(len(a)):
        a[i] = -a[i]

if __name__ == '__main__':
    num = Value('d', 0.0)
    arr = Array('i', range(10))

    p = Process(target=f, args=(num, arr))
    p.start()
    p.join()

    print(num.value)
    print(arr[:])


# Expected Return
# 3.1415927
# [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]

# My Return
# 0.0
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

【问题讨论】:

  • 当我在我的 Windows 机器(没有 Jupyter Notebook)上使用 Python 3.7.4 运行您的问题中的代码时,会打印“例外返回”值。不清楚图片中的代码与您的问题有什么关系。
  • @martineau 图片是先前的答案,已被删除,我编辑并发布了图片,以向作者证明他的建议都不起作用。我可以稍后从 Jupyter 中尝试此代码,但它应该可以正常工作吗?
  • 好吧,您问题中的实际代码对我来说看起来是正确的,并且在我的系统上似乎工作正常。
  • 我可以确认代码(在 UNIX 下作为脚本运行时)给出了预期的输出。

标签: python multiprocessing shared-variable


【解决方案1】:

在交互式环境中工作时(即使用笔记本),您需要使用ProcessPool 导入要调用的函数。

在同一文件夹中,创建一个文件 utils.py,在其中插入您的 f 函数,然后将其导入到您的笔记本中:

from utils import f

之后你的进程应该可以正常运行了。

完整代码:

util.py:

def f(n, a):
    n.value = 3.1415927
    for i in range(len(a)):
        a[i] = -a[i]

你的笔记本:

from multiprocessing import Process, Value, Array
from utils import f


if __name__ == '__main__':
    num = Value('d', 0.0)
    arr = Array('i', range(10))

    p = Process(target=f, args=(num, arr))
    p.start()
    p.join()

    print(num.value)
    print(arr[:])

【讨论】:

    猜你喜欢
    • 2020-06-12
    • 1970-01-01
    • 2017-06-18
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多