0

我正在尝试深入了解在 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
4

1 回答 1

0

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(), " ")
于 2021-02-13T11:45:45.570 回答