使用共享值在 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 多处理的主要内容,如果未能解决你的问题,请参考以下文章
使用 MSVC2015 在 Windows 上进行 clang-tidy
使用 cygwin 和 git bash 在 Windows 10 上进行 Shell 脚本评估失败