python 创建进程的时候为什么要写在main里面

# python 中在创建进程的时候,如果创建进程的代码不写在if __name__ == '__main__':的内部,程序就会报错。
# 比如:

import multiprocessing

def f1():
    print('进程1正在运行')

#没有写在if __name__ == '__main__':内部
print('主进程......')
p = multiprocessing.Process(target=f1)
p.start()

# 运行的时候就会报错:

# RuntimeError: 
#         An attempt has been made to start a new process before the
#         current process has finished its bootstrapping phase.
#         This probably means that you are not using fork to start your
#         child processes and you have forgotten to use the proper idiom
#         in the main module:
#             if __name__ == '__main__':
#                 freeze_support()
#                 ...
#         The "freeze_support()" line can be omitted if the program
#         is not going to be frozen to produce an executable.

# 报错的原因是:
# 当您创建一个新的子进程时,子进程可能(主要取决于您使用的操作系统)重新导入当前模块(也就是子进程所在的模块)。
# 导入这个模块的时候就会执行里面的代码,那么子进程就会再次执行下面的语句:

# p = multiprocessing.Process(target=f1)
# p.start()
# 这样就会构成一个生成进程的无线循环。
# 但是当你把代码放到if __name__ == '__main__':内部的时候,子进程再次导入这个模块的时候就不会执行里面的代码,因为这时候__name__并等于__mian__。
# 下面以具体的实例来说明
import multiprocessing
import os

# 用来测试子进程是否会执行这句代码
print('进程id%s' % os.getpid())  # 该句的详细说明见注释
'''
这是一句标志,用来检验子进程是否会在开启以后重新导入一遍这个模块,'
      '如果只打印了一遍,那么就是只在主进程中执行了一遍'
      '如果打印了三遍,就证明两个子进程都会执行一遍该语句'
      '也就是说,两个子进程在开启的时候,都重新导入并加载了一遍该模块

'''


def work1():
    print("work1正在运行......")
    print('子进程1的id是%s' % os.getpid())
    print("work1结束......")


def work2():
    print("work2正在运行......")
    print('子进程2的id是%s' % os.getpid())
    print("work2结束......")


if __name__ == '__main__':
    # ++++表示主进程范围
    print('++++++++++++++++++++++++')  # 主进程开始
    print('主进程:%s' % os.getpid())

    # -----子进程1范围
    print('---------------------')
    p1 = multiprocessing.Process(target=work1)
    p1.start()
    p1.join()

    '''
      对于进程1来说,主进程所在的这个模块是被导入进子进程1的,所以__name__不等于__main__,因此在导入的时候就不会在执行__name__下的代码了
      '''

    print('---------------------')

    # =======子进程2范围
    print('=================')
    p2 = multiprocessing.Process(target=work2)
    p2.start()
    p2.join()

    '''
       对于进程2来说,主进程所在的这个模块是被导入进子进程1的,所以__name__不等于__main__,因此在导入的时候就不会在执行__name__下的代码了
    '''

    print('=================')
    # 主进程结束
    print('++++++++++++++++++++++++')

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值