# 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('++++++++++++++++++++++++')