【问题标题】:Python multiprocessing behavior on MacOS and WindowsMacOS 和 Windows 上的 Python 多处理行为
【发布时间】:2020-06-27 21:51:20
【问题描述】:

我正在创建一个在 Windows PC 上运行的程序,但我在使用多处理模块时遇到了一些问题。

假设我们运行以下代码:

import multiprocessing as mp

def f():
    print('f running')


def main():
    p = mp.Process(target=f)
    p.start()

print('test print')

if __name__ == '__main__':
    main()

如果我在 MacOS 上运行它,我会得到预期的结果:

test print
f running

如果我在 Windows 上运行它,我会得到:

test print
test print
f running

我知道这种行为是因为 python 为每个新进程导入整个文件,但是有没有办法让它像在 MacOS 中一样?

谢谢!

编辑:

在我的程序中,我在文件顶部定义了一些永远不会更改的全局变量,但是当进程启动并导入文件时,这些全局变量会被刷新并获得新值,这是一个问题。

在 if name ==... 中创建这些全局变量适用于 MacOS,但不适用于 Windows。在 MacOS 上,我无论如何都不需要这样做。

import multiprocessing as mp

def f():
    print(v)
    print('f running')


def main():
    p = mp.Process(target=f)
    p.start()

print('test print')

if __name__ == '__main__':
    v = 'a variable'
    main()

MacOS 上的输出:

test print
a variable
f running

Windows 上的输出:

test print
test print
Process Process-1:
Traceback (most recent call last):
  File "C:\Users\ixg21219\AppData\Local\Programs\Python\Python38-32\lib\multiprocessing\process.py", line 313, in _bootstrap
    self.run()
  File "C:\Users\ixg21219\AppData\Local\Programs\Python\Python38-32\lib\multiprocessing\process.py", line 108, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\ixg21219\Desktop\MP_test\test.py", line 4, in f
    print(v)
NameError: name 'v' is not defined

【问题讨论】:

  • 我认为 Windows 用户必须做一些事情 freeze_support() jiggery-pokery。
  • 在 Windows 上 mp.processes 是通过导入主脚本运行的,因此每次发生这种情况时都会执行模块级别的任何内容(除了在脚本本身启动时运行) — 这就是为什么需要if __name__ == '__main__': 保护来防止不希望的递归的原因。请参阅文档中 Contexts and start methods 部分中的 spawnfork

标签: python windows macos multiprocessing python-import


【解决方案1】:

怎么样:

if __name__ == '__main__':
    print('test print')
    main()

【讨论】:

  • 这适用于打印,但我真正的问题是我在文件顶部定义的全局变量。我将编辑问题以添加一个示例,说明这会给我带来什么麻烦。
猜你喜欢
  • 2020-07-18
  • 1970-01-01
  • 2014-11-20
  • 1970-01-01
  • 2015-09-02
  • 1970-01-01
  • 1970-01-01
  • 2021-02-21
相关资源
最近更新 更多