使用共享值在 Windows 上进行 python 多处理

Posted

技术标签:

【中文标题】使用共享值在 Windows 上进行 python 多处理【英文标题】:python mutiprocessing on windows using shared values 【发布时间】:2021-05-15 06:38:57 【问题描述】:

我正在尝试深入了解在 python 中使用多处理。我有一个使用 Unix 共享值的示例,但我无法获得一个在 Windows 10 上工作的简单教育示例。 下面的代码在 Windows 上运行正常,但调用更新了 foo() 中注释掉的共享值。 请问我的问题是什么?

import multiprocessing as mp

def foo(q):
    #global shared_num
    q.put('hello')
    #shared_num.value = 777

if __name__ == '__main__':
    global shared_num
    mp.set_start_method('spawn')
    shared_num = mp.Value('d', 0)
    lock = mp.Lock()
    q = mp.Queue()
    p = mp.Process(target=foo, args=(q,))
    p.start()
    p.join()
    print(q.get(), " ",shared_num.value)
    #print(q.get(), " ")

如果我使用 foo() 设置我得到的共享值运行下面的代码:

Traceback (most recent call last):
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.2032.0_x64__qbz5n2kfra8p0\lib\multiprocessing\process.py", line 315, in _bootstrap
    self.run()
  File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.2032.0_x64__qbz5n2kfra8p0\lib\multiprocessing\process.py", line 108, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\ken38\OneDrive\Projects\Python\GH_Pi\python\ms_mp.py", line 6, in foo
    shared_num.value = 777
NameError: name 'shared_num' is not defined
hello   0.0

【问题讨论】:

在 Windows 上(或者如果 start 方法明确地“spawn”),子进程是通过执行除 main-guard 之外的整个模块然后调用指定的函数来生成的。这意味着永远不会在子进程中设置“shared_num”。解决方案:将其作为参数添加到“foo”调用中。 锁同样需要。该代码现在可以在 Windows 10 和 Debian 上运行。我将尝试构建一个更复杂的示例。谢谢。 不要将答案编辑到问题中。如果您有答案并想分享,请提交答案。 对这个回复的语气很不满意,但也许这并不意味着对论坛的极少数用户不礼貌。 可能是您忽略告知自己该网站如何运作的直接结果。例如,您为什么积极决定不使用tour?结果:由于您试图节省时间,我不得不花时间清理您。也许这解释了为什么响应并不比绝对要求更友好。 【参考方案1】:

Michael Butscher 实际上用他的评论回答了这个问题。但由于我无法将其标记为答案,我想我会将更正后的代码显示为答案。 如果您尝试在 Windows 上测试简单示例,这确实突出了差异。基于 Linux 的示例可能不适用于 Windows。 此代码适用于 Windows 和 Debian (Rpi)。

import multiprocessing as mp

def foo(q, shared_num, lock):
    #global shared_num
    q.put('hello')
    with lock:
        shared_num.value = 777

if __name__ == '__main__':
    global shared_num
    mp.set_start_method('spawn')
    shared_num = mp.Value('d', 0)
    lock = mp.Lock()
    q = mp.Queue()
    p = mp.Process(target=foo, args=(q, shared_num, lock,))
    p.start()
    p.join()
    print(q.get(), " ",shared_num.value)
    #print(q.get(), " ")

【讨论】:

以上是关于使用共享值在 Windows 上进行 python 多处理的主要内容,如果未能解决你的问题,请参考以下文章

Vue js v-if在共享切换按钮上进行条件渲染

使用 MSVC2015 在 Windows 上进行 clang-tidy

使用 cygwin 和 git bash 在 Windows 10 上进行 Shell 脚本评估失败

linux挂载windows共享的文件夹

Appveyor 是不是支持在 Windows 10 专业版和家庭版上进行测试?

使用 Windows cmd 在 Debian VPS 上进行 SSH 密钥连接