Discuss / Python / 必须把创建子进程的部分写在“ if __name__ == '__main__':”的对比示例

必须把创建子进程的部分写在“ if __name__ == '__main__':”的对比示例

Topic source

ywjco_567

#1 Created at ... [Delete] [Delete and Lock User]

例子:

# -*-coding:UTF-8-*-
# FileName: 创建进程.py

from multiprocessing import Process

def func(n):
    print("这里是子进程func...", n)

print("开始执行父进程...\n\n")
p = Process(target=func, args=(1,))
p.start()
print("父进程结束")

执行结果:

D:\Python37\python.exe D:/Python37/Code/mp_创建进程.py
开始执行父进程...
父进程结束
开始执行父进程...

Traceback (most recent call last):
...
...
...
File "D:\Python37\lib\multiprocessing\spawn.py", line 143, in get_preparation_data
    _check_not_importing_main()
File "D:\Python37\lib\multiprocessing\spawn.py", line 136, in _check_not_importing_main
    is not going to be frozen to produce an executable.''')
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.
运行时错误:
在当前进程完成其引导阶段之前,已尝试启动新进程。
这可能意味着您没有使用fork来启动子进程,并且忘记了在主模块中使用适当的惯用法:
if __name__ == '__main__':
    freeze_support()
    ...
如果不打算冻结程序以生成可执行文件,则可以省略“freeze_support()”行。

出错的关键原因,在出错前的一段代码运行结果上已显示:

1    开始执行父进程...
父进程结束
2    开始执行父进程...

即:

1   import Process-------------------------------------------执行了一次;

2    p = Process(target=func, args=(1,))----------------再次被执行,进入死循环...;

python 有一个函数“_check_not_importing_main()”就是要检查这种状况。

修改的代码:

# !/usr/bin/python3
# -*-coding:UTF-8-*-
# FileName: 创建进程.py

from multiprocessing import Process

def func(n):
    print("这里是子进程func...", n)

if __name__ == '__main__':
    print("开始执行父进程main...\n\n")
    p = Process(target=func, args=(1,))
    p.start()
    print("父进程main结束")

运行结果正常,只执行一次:

D:\Python37\python.exe D:/Python37/Code/mp_创建进程.py
开始执行父进程main...

父进程main结束
这里是子进程func... 1

ywjco_567

#2 Created at ... [Delete] [Delete and Lock User]

多进程真的很难,以前没有接触过,只有耗时间慢慢看官方文档。


  • 1

Reply