multiprocessing库之pool浅析
因为著名的GIL问题,Python提供了一个标准库multiprocessing,并建议用它编写多进程并发程序,以解决CPU密集型程序的运行效率问题。这个库内部主要是在处理各种跨平台问题,使用起来比较繁琐。不过其中提供了一个进程池的实现,善加利用的话倒是能满足许多场景的需求。
虽然自Python 3.2起又有一个concurrent库实现了进程/线程池并提供了更简便的接口,但从几个角度来讲我更倾向于使用multiprocessing的进程池:
- concurrent极大的限制了用户的控制权,难以应付复杂的应用场景;
- 很难保证永远不会用到Python 2,所以在有可能的情况下最好是编写Python 2/3兼容的代码;
关于multiprocessing.Pool的使用介绍目前已经遍地都是,我就来对它的内部机制做一点简单的分析。
以下分析均基于Python 3.5.1的源码。
多进程通信的限制
所有多进程协作的程序都会涉及进程间的通信问题,因此在谈论进程池的设计前,关于进程间通信的限制就不可不知。
与多线程模型相比,由于每个进程的地址空间是独立的,因此进程间传递数据就必须依托于操作系统提供的机制。这些机制可能是共享内存/消息队列/信号量或Domain socket等 ...