1.multiprocessing的背景
python的threading模块主要用于多线程的开发,但由于GIL的存在,使得python中的多线程其实并不是真正的多线程,如果想要充分的使用多核CPU的资源,大部分情况下就需要使用多进程。它的基本用法函数和threading模块相类似,唯一不同的就是它使用了多进程而不是多线程,每个进程有自己独立的GIL,因此不会出现进程之间的GIL争夺。
除此以外,产生multiprocessing的另一个原因与Windows系统和Linux系统的不一致有关。Linux系统提供了一个fork()函数用于系统调用。该函数调用一次,会返回一次。调用时操作系统会自动把当前进程(父进程)复制一份,然后分别在父进程和子进程内返回。子进程返回0,而父进程返回子进程的ID。由于一个父进程可以复制出任意数目的子进程,所以父进程要记下每个子进程的ID,而子进程只需要调用getpid()就可以拿到父进程的ID。而Windows不支持fork()函数的使用,因此该种无法在Windows下进行使用,对程序的跨平台使用也就产生了很大的阻碍。因此,multiprocessing模块提供了更多的用于支持多进程开发的方法。
2.multiprocessing的常用组件和功能
2.1 创建管理进程模块
Process:用于创建进程
Pool:用于创建管理进程池
Queue:用于进程通信,资源共享
Value:用于进程通信,资源共享
Array:用于进程通信,资源共享
Pipe:用于管道通信
Manager:用于资源共享
2.2 同步子进程模块
Condition:条件变量锁
Event:事件锁
Lock:互斥锁
RLock:递归锁
Semaphore:信号量锁