1.上篇都是直接创建Process对象来创建子进程,其实还可以通过继承来创建子进程。
来看看Process源码,可以通过承继Process,重写run方法来启动子进程。因为对一个不包括target属性(即当target=None时)的Process类执行start()方法,就会运行类中的run()方法。
2.使用进程池Pool创建进程
Pool进程池,可以把进程池比做一个水池,假设我们要完成放满10个水盆水的任务,在这个水池中,最多可以放三个水盆,也就是最多能用三个水盆接水。
Pool有2种启动方式,
1. apply_async() 非阻塞方式(并行,异步),见下,下面代码创建了一个3个进程的进程池,在执行10个任务时,每次都是同时三个进程启动执行三个任务。回到放水任务,相当于有三个水笼头,三个水盆同时接水,每个水盆接满了就将水倒进桶里再重新接水。一直接满10个水盆的水。这三个水盆是同时接水的,并行,异步,互不干涉。
2. apply(),阻塞式,进程池里的进程按顺序执行,必须一个进程执行完了才能继续下一个进程。回到放水任务,相当于有三个水盆,但是只有一个水笼头能用,三个水盆按顺序排好,一个接满了才能放另一个进去,轮流接水,一般不用这个方法来启动,失去了多进程的作用。
close(), 关闭Pool, 不再接受新的任务。即整个池子不再使用,已运行的进程会继续运行完。
terminate(), 不管任务是否完成,彻底终止任务,相当直接杀死进程,不管是运行的还是没运行的,所有进程all die!