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.process
es 是通过导入主脚本运行的,因此每次发生这种情况时都会执行模块级别的任何内容(除了在脚本本身启动时运行) — 这就是为什么需要if __name__ == '__main__':
保护来防止不希望的递归的原因。请参阅文档中 Contexts and start methods 部分中的 spawn 和 fork。
【参考方案1】:
怎么样:
if __name__ == '__main__':
print('test print')
main()
【讨论】:
这适用于打印,但我真正的问题是我在文件顶部定义的全局变量。我将编辑问题以添加一个示例,说明这会给我带来什么麻烦。以上是关于MacOS 和 Windows 上的 Python 多处理行为的主要内容,如果未能解决你的问题,请参考以下文章
通过JAVA连接SAP (sapjco3.jar在Windows和MacOS上的配置)
MacOS 上的 Python 3.6 和 MySQL 8.0.21:如何给表 camelCase 列名? [复制]
具有 Node 后端的 Vue 应用程序除了 Windows localhost 上的主页,在生产环境和 MacOS localhost 上工作之外,不会呈现任何内容