MacOS 和 Windows 上的 Python 多处理行为

Posted

技术标签:

【中文标题】MacOS 和 Windows 上的 Python 多处理行为【英文标题】:Python multiprocessing behavior on MacOS and Windows 【发布时间】: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 【参考方案1】:

怎么样:

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

【讨论】:

这适用于打印,但我真正的问题是我在文件顶部定义的全局变量。我将编辑问题以添加一个示例,说明这会给我带来什么麻烦。

以上是关于MacOS 和 Windows 上的 Python 多处理行为的主要内容,如果未能解决你的问题,请参考以下文章

通过JAVA连接SAP (sapjco3.jar在Windows和MacOS上的配置)

Python和C#哪个好就业?python入门

MacOS 上的 Python 3.6 和 MySQL 8.0.21:如何给表 camelCase 列名? [复制]

具有 Node 后端的 Vue 应用程序除了 Windows localhost 上的主页,在生产环境和 MacOS localhost 上工作之外,不会呈现任何内容

MacOS 上的 XAMPP - 使用 localhost 而不是 IP 地址

无法访问 MacOS 上的所有冒险作品表