使用multiprocessing.Process尝试创建多个进程结果有一条函数外的代码被多次执行了。无法理解

使用multiprocessing.Process尝试创建多个进程结果有一条函数外的代码被多次执行了。无法理解,请教各位为何print(os.path.basename(r'D:\small_project_小项目\help_oneself_to\os_test\os_test_01.py')) 被多次执行

import os
import multiprocessing


print(os.path.basename(r'D:\small_project_小项目\help_oneself_to\os_test\os_test_01.py'))#获取文件名
# print(os.getenv())


# function_pid=1
def worker():
    print(f"子进程ID: {os.getpid()}")

if __name__ == "__main__":
    # 创建三个进程对象并启动子进程
    for i in range(3):
        p = multiprocessing.Process(target=worker)
        #print(worker())
        p.start()

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/052976456196141.png "#left")

【以下回答由 GPT 生成】

解决方案

该问题的原因是因为在Windows平台上,每个进程都会执行一次脚本中的所有顶级代码,包括导入语句和全局变量的定义等。因此,在使用multiprocessing.Process创建多个进程时,函数外的代码会被多次执行。

为了解决这个问题,可以将函数外的代码移动到一个新的函数中,并将其放在if __name__ == "__main__":的条件语句下。这样,函数外的代码只会在主进程中执行一次,而子进程中不会再执行。

下面是修改后的代码示例:

import os
import multiprocessing

def main():
    print(os.path.basename(r'D:\small_project_小项目\help_oneself_to\os_test\os_test_01.py'))  # 获取文件名


    # function_pid=1
    def worker():
        print(f"子进程ID: {os.getpid()}")


    if __name__ == "__main__":
        # 创建三个进程对象并启动子进程
        for i in range(3):
            p = multiprocessing.Process(target=worker)
            p.start()

if __name__ == "__main__":
    main()

这样修改后,你会发现函数外的代码只会在主进程中执行一次,而不会被多次执行。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^