为什么在导入多处理时使用 time.sleep 时字符串打印 3 次而不是 1 次?

why is a string printing 3 times instead of 1 when using time.sleep with multiprocessing imported?

因此,当我使用与我的打印相同的代码导入多处理,然后是 time.sleep 时,它将打印字符串 3 次,而不是我请求的 1 次。我想知道为什么会发生这种情况以及如何解决此问题(如果可能),在此先感谢您。我的代码如下。

import time
import multiprocessing

print('teeeest')
time.sleep(3)

def test1():
    print('test1')
def test2():
    print('test2')

if __name__ == '__main__':
    p1 = multiprocessing.Process(target=test1)
    p2 = multiprocessing.Process(target=test2)
    p1.start()
    p2.start()
    p1.join()
    p2.join()

而代码的结果如下:

teeeest
teeeest
teeeest
test1
test2

(注意 'test1' 和 'test2' 按预期同时发送)

当您使用多处理时,Python 使用解释器的 brand-new 副本创建一个全新的进程,并从顶部再次启动 运行 您的文件。您不想在每个 child 中完成的任何事情都需要在您的 if __name__ == '__main__': 块中。

Python 在您使用多处理时创建一个新进程 - 在 Microsoft Windows O.S 中,新进程具有与原始进程相同的加载模块的唯一方法进程有,就是加载它们 - Python 模块在加载时执行。

在其他 O.S.s(MacOs、Linux 等...)上 Python 使用“fork”系统调用创建 运行ning 按原样处理,模块不必 运行 并再次执行。

Windows 下的行为是任何代码 运行 多处理 必须if __name__ == "__main__": 表达式保护的动机:在复制process __name__ 的内容不再是 __main__,因为以前的主文件是由 multiprocessing machinery 在 subprocesses 上导入的。

更新:似乎从 Python 3.8 开始,在 MacOS 上默认使用 Spawn,而不是 fork - 所以在 Mac 上你会得到相同的行为. (这里好像https://www.reddit.com/r/learnpython/comments/g5372v/multiprocessing_with_fork_on_macos/