【Multiprocessing系列】Multiprocessing基础
2017/05/26
·
multiprocessing是Python的标准模块,它既可以用来编写多进程,也可以用来编写多线程。如果是多线程的话,用multiprocessing.dummy即可,用法与multiprocessing基本相同,这里主要介绍多进程的用法,欢迎纠错。
(一)Multiprocessing介绍
为什么要使用python多进程?
因为python使用全局解释器锁(GIL),他会将进程中的线程序列化,也就是多核cpu实际上并不能达到并行提高速度的目的,而使用多进程则是不受限的,所以实际应用中都是推荐多进程的。
如果每个子进程执行需要消耗的时间非常短(执行+1操作等),这不必使用多进程,因为进程的启动关闭也会耗费资源。
当然使用多进程往往是用来处理CPU密集型(科学计算)的需求,如果是IO密集型(文件读取,爬虫等)则可以使用多线程去处理。
multiprocessing常用组件及功能
创建管理进程模块:
- Process(用于创建进程模块)
- Pool(用于创建管理进程池)
- Queue(用于进程通信,资源共享)
- Value,Array(用于进程通信,资源共享)
- Pipe(用于管道通信)
- Manager(用于资源共享)
同步子进程模块:
- Condition
- Event
- Lock
- RLock
- Semaphore
(二)Multiprocessing进程管理模块
说明:由于篇幅有限,模块具体用法结束请参考每个模块的具体链接。
Process模块
Process模块用来创建子进程,是Multiprocessing核心模块,使用方式与Threading类似,可以实现多进程的创建,启动,关闭等操作。
具体介绍请参考:Process模块介绍
Pool模块
Pool模块是用来创建管理进程池的,当子进程非常多且需要控制子进程数量时可以使用此模块。
具体介绍请参考:Pool模块介绍
Queue模块
Queue模块用来控制进程安全,与线程中的Queue用法一样。
Pipe模块
Pipe模块用来管道操作。
Manager模块
Manager模块常与Pool模块一起使用,作用是共享资源。
(三)Multiprocessing同步进程模块
Lock模块
作用:当多个进程需要访问共享资源的时候,Lock可以用来避免访问的冲突。
具体场景:所有的任务在打印的时候都会向同一个标准输出(stdout)输出。这样输出的字符会混合在一起,无法阅读。使用Lock同步,在一个任务输出完成之后,再允许另一个任务输出,可以避免多个任务同时向终端输出。
代码实现: