我正在编写一个简单的脚本,它利用了多处理模块.我没有使用这个模块的经验,我只是试着了解如何使用它.然而,我遇到了一个令人困惑的行为,即脚本中的print语句被执行两次.

我的理解是,只要我直接运行脚本,if __main__以下的代码就应该运行.而且,整个脚本应该按程序运行.我希望打印语句在if块之前只运行一次.为什么要多次执行?我通常不使用这种模式来构建代码,所以我想知道是否有与使用if __main__相关的行为我可能没有意识到.这只是一个正常的if声明,就像其他任何一个."

我不知道这是怎么回事.有人能提供一些关于为什么会发生这种情况的见解吗?谢谢! 我运行的是Anacaonda-Spyder 5.4.3中的python3.11.3

import multiprocessing

print("TEST TEST TEST")

def square(x):
    return x * x

if __name__ == '__main__':
     numbers = [1, 2, 3, 4, 5]
     with multiprocessing.Pool() as pool:
         results = pool.map(square, numbers) 
     print(results)

结果:

TEST TEST TEST
[1, 4, 9, 16, 25]

TEST TEST TEST
TEST TEST TEST

推荐答案

Context and start methods.一个打印来自顶级流程,两个来自辅助流程.

当使用spawn方法时,多处理可能会导入您的模块来访问square函数.如果你不想执行模块级代码,比如这个print语句,它需要进入if __name__ == '__main__': guard.

如果您将开始方法设置为fork,则您应该只会在此处得到一张打印:

if __name__ == '__main__':
    multiprocessing.set_start_method('fork')
    ...

但不要依赖于此——而是修复模块,这样导入就不会有副作用了.

Python-3.x相关问答推荐

使用魔方无法从图像中识别单个字符

使用Python请求从特定URL下载图像时出错

为什么我的Selenium脚本在密码元素上失败?

无法使用xpath关闭selenium中的弹出窗口

如何将值映射到具有上限和下限的新列

你能骗PIP 让它相信包已经安装了吗

在 groupby 之后,Pandas 在特定类别中获得最常见和最后的值

在不改变 python 中原始数组顺序的情况下,对多维字符串数组进行降序排序?

numpy是如何添加@运算符的?

matplotlib.pyplot 多边形,具有相同的纵横比和紧凑的布局

如何使用 regex sub 根据列表中的变量替换字符

合并两个numpy数组

两个字符串之间的正则表达式匹配?

try 注释散列变量时,ABCMeta对象不可下标

Pandas 的 EMA 与股票的 EMA 不匹配?

用 numpy nan 查找列表的最大值

在不关心项目的情况下运行生成器功能的更简单方法

使用完整路径激活 conda 环境

如何在python中创建代码对象?

带有数千个逗号刻度标签的 MatPlotLib 美元符号