本来的主进程是当前运行的程序 执行到os.fork()时候,又创建了一个子进程 主进程向下执行,子进程也继续向下运行,根据返回值的不同分别执行下面的代码 可以使用os.getpid()得到当前进程的父进程的进程号
如果父进程先执行完毕,那么先退出,子进程可以继续执行,即他们各自执行,代码是同一份代码,但数据是各自独有的,互不影响,哪怕是全局变量,也不互相影响。
fork只能用在类Linux系统中,不能再Windows 那么python提供了Process
用fork创建的子进程,可以和主进程不同时执行完毕,而Process方法中,主进程需要等到子进程执行完毕再完成
p.join(timeout) //堵塞,等待p进程结束之后,主程序才会往下走 p.terminate()直接结束某个子进程
也可以自定义类继承Process,并重写run方法 并用自定义类创建的对象调用start方法。 然后start自动调用子类中的run方法,这里明明没有start 方法,因为他在Process类中定义,这里就用到了工厂方法模式。
进程池:
这里注意需要加入join 否则主进程关闭后,进程池也会消失,那么无法继续执行子进程
僵尸进程-----子进程结束,父亲没有对其进行收尸,在收尸之前的这段期间就叫做僵尸进程
孤儿进程------父进程over,子进程还没结束 那么需要系统进行孤儿的收尸
pool.apply(worker) 这种方式以堵塞的方式执行 必须执行完一个worker添加后,执行完成才再进行下一个worker的添加
apply一般不用 一般用apply_async()
进程间通信-Queue:
创建队列进行参数的传递
线程池进行参数传递的话 需要创建Manager 然后使用Manager().Queue()队列传递信息