为什么这里必须有 if __name__ == '__main__':

为什么这里必须有 if __name__ == '__main__':

如题

# coding:utf-8

"""
使用了 multiprocessing 模块来创建两个子进程(work_a 和 work_b),并在主进程中启动它们。
具体来说,这个程序的功能是:
主进程使用 time.time() 函数记录程序开始运行的时间;主进程创建了两个子进程,分别执行 work_a 和 work_b 函数;主进程等待子进程执行完毕;
主进程输出每个子进程是否还在运行,以及子进程执行的时间消耗;最后输出主进程的 PID 以及程序运行的总时间。
其中,work_a 和 work_b 函数都是简单的打印语句,用于测试子进程的执行情况。
在这个程序中,主进程先创建了子进程 a_p,然后等待子进程执行完毕后创建了子进程 b_p,并输出了子进程的名称和状态。
最后输出了主进程的 PID 和程序运行的总时间。
"""

import time
import os
import multiprocessing


def work_a():
    for i in range(3):
        print(i, 'a', os.getpid())
        time.sleep(1)


def work_b():
    for i in range(3):
        print(i, 'b', os.getpid())
        time.sleep(1)


if __name__ == '__main__':
    start = time.time()
    a_p = multiprocessing.Process(target=work_a)
    b_p = multiprocessing.Process(target=work_b)
    for p in (a_p, b_p):
        p.start()
        p.join()
    for p in (a_p, b_p):
        print(p.is_alive())
    print(os.getpid(), time.time() - start)


正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学,你好!进程中每个子进程是通过导入所在脚本的模块实现模块中函数的调用的,所以,为了避免将创建子进程的语句也被导入(因为这样就会造成无限循环创建子进程,因此python禁止了在子进程中再创建子进程,否则会报错),创建子进程的语句必须在if __name__=='__main__'语句之后定义,或者如果创建子进程的语句是定义在一个函数中的,那么这个函数调用必须在if __name__=='__main__'语句之后,这是python多进程中的强制性语法规则。


祝学习愉快~

  • Mr朱_ 提问者 #1

    假定python允许在if __name__=='__main__'之前创建子进程:

    a.py里面包含创建子进程的语句,b.py   import a   b.py会创建多余的子进程

    是这个意思吗?

    但是这样也不会导致无限创建子进程

    我还是不理解意思

    2023-05-26 17:59:09
  • 好帮手慕小猿 回复 提问者 Mr朱_ #2

    同学,你好!假定当前文件ccc.py ,ccc.py 文件中有创建子进程,创建子进程时子进程将a.py作为模块导入的,此时a.py中有创建子进程的代码,那子进程又会执行创建子进程,会造成无线递归创建子进程。若是加上if __name__=="__main__"当作为ccc.py模块导入时,if __name__=="__main__"下的代码不会被执行,也就不会执行创建子进程的代码,无法递归创建子进程了。

    https://img1.sycdn.imooc.com//climg/647088f309fd26cb08440791.jpg

    ccc.py代码,有print("我是ccc.py的输出")

    https://img1.sycdn.imooc.com//climg/647089730934e56b08320597.jpg

    d1.py 将ccc.py 作为模块导入,并没有执行if __name__=="__main__"下的语句,只输出了"我是ccc.py的输出"这句话

    https://img1.sycdn.imooc.com//climg/64708a0e09aeec2905880405.jpg

    祝学习愉快~

    2023-05-26 18:31:25
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师