多进程系列之multiprocessing模块简介

332 阅读2分钟

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:信号量锁