于末 2023-08-10 16:04 采纳率: 80%
浏览 4

使用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")
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-08-10 18:54
    关注

    【以下回答由 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()
    

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


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

报告相同问题?

问题事件

  • 创建了问题 8月10日