from multiprocessing import Process #用multiprocessing可以在主进程中创建子进程
import os #导入os模块
def mk_pro(name):
print('子进程{},id是{}'.format(name,os.getpid())) #os.getpid():查看进程id
if __name__ == '__main__':
print('父进程id是{}'.format(os.getpid()))
p = Process(target=mk_pro,args=('test',)) #利用Process创建子进程实例,target传入函数,args传入函数参数
#args这里要注意,当元祖只有一个元素的时候要加上逗号,不要掉陷阱里面了
print('子进程启动')
p.daemon = True#将主线程设置为Daemon线程,它退出时,其它子线程会同时退出,不管是否执行完任务
daemon 默认会是False,为True则是它退出时,其它子线程会同时退出,不管是否执行完任务
p.start() #启动进程
p.join() #等待子进程结束后继续往下运行。用于进程间同步。
print('子进程结束')
这里需要注意的是:
#这里的父进程指得就是我们当前程序文件,如果不加if __name__ == '__main__':
#则会报错,因为子进程在运行时是依赖于父进程的所有内容的,创建一个子进程的
时候该子进程就会复制当前父进程的模块。
不加会报如下错误:
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
总结:
# 1. Process(target=run_proc, args=('test',)) 用于创建一个子进程,target指定子进程中任务,args给target指定的任务传参。
# 2. start()方法启动进程
# 3. join()方法等待子进程结束后继续往下运行。用于进程间同步。
# 4. Process(target=run_proc, args=('test',)daemon=True)
# daemon=True #将主线程设置为Daemon线程,它退出时,其它子线程会同时退出,不管是否执行完任务
#if __name__ == '__main__':
#这里的父进程指得就是我们当前程序文件,如果不加if __name__ == '__main__':
#则会报错,因为子进程在运行时是依赖于父进程的所有内容的,创建一个子进程的时候该子进程就会复制当前父进程的模块。