1、操作系统中提供了一个fork()函数,它非常特殊。普通函数的调用,调用依次,返回一次。但是fork()函数调用一次,返回2次。因为操作系统自动把当前进程(父进程)复制了一份(子进程),然后分别在父进程和子进程内返回。
子进程永远返回0,而父进程返回子进程的ID.这样做的理由是,一个父进程可以fork出很多子进程,所以父进程要记下每个子进程的ID,而子进程指需要调用getppid()就可以拿到父进程的ID.
python中的os 模块封装了常见的系统调用,其中就有fork.python程序创建子进程
import os
pid =os.fork()
if pid==0:
子进程
else:
父进程
由于windows没有fork调用,而python又是跨平台的,所以python提供一种跨平台的多进程支持。multiprocessing模块就是跨平台版本的多进程模块。
multiprocessing模块提供了一个Process类来代表一个进程对象。
创建一个Process对象,用start方法来启动
p.start()
p.join()
join方法可以等待子进程结束后在继续往下执行,通常用来进程间的同步。
如果要大量产生子进程,可以用进程池的方式来批量产生子进程。
from multiprocessing import Pool
在 unix/linux 下 multiprocessing 模块封装了fork()调用。由于windows没有fork调用,因此multiprocessing 需要模拟出fork的效果,父进程所有的python对象都必须通过pickle序列化再传到子进程去,所以,如果multiprocessing在windows下调用失败了,要先考虑是不是pickle失败了。