并发编程(5)-管道、数据共享、进程池
概要:
1.管道:Pipe() 也是IPC通信的一种,
2.数据共享:Manager()
3.进程池:Pool()
4.信号量和进程池的区别
一.管道:Pipe()
IPC通信机制:IPC是intent-Process Communication的缩写,含义为进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程。IPC不是某个系统所独有的,任何一个操作系统都需要有相应的IPC机制.上篇写的"队列"就是ipc通信,本节再介绍一篇ipc通信:管道
创建管道的类: Pipe():
Pipe():在进程之前创建一条管道,并返回元组(conn1,conn2),其中conn1,conn2表示管道两端的连接对象,强调一点:必须在产生Process对象之前产生管道(默认管道是全双工的,如果括号内写False,conn1只能用于接收,conn2只能用于发送。)
二.数据共享:Manager()
进程间应该尽量避免通信,即便需要通信,也应该选择进程安全的工具来避免加锁带来的问题,应该尽量避免使用本节所讲的共享数据的方式,以后我们会尝试使用数据库来解决进程之间的数据共享问题。
多进程共同去处理共享数据的时候,就和我们多进程同时去操作一个文件中的数据是一样的,不加锁就会出现错误的结果,进程不安全的,所以也需要加锁
三.进程池:Pool()
系统不能无限的开进程,开启或者关闭进程都需要消耗时间,即便你开启了很多,系统也不会让他们同时运行,这样反而影响程序的效率,那怎么解决呢,引出进程池的概念.最常用的就是开进程池,
概念:
定义一个池子,在里面放上固定数量的进程,有需求来了,就拿一个池中的进程来处理任务,等到处理完毕,进程并不关闭,而是将进程再放回进程池中继续等待任务。如果有很多任务需要执行,池中的进程数量不够,任务就要等待之前的进程执行任务完毕归来,拿到空闲进程才能继续执行。也就是说,池中进程的数量是固定的,那么同一时间最多有固定数量的进程在运行。这样不会增加操作系统的调度难度,还节省了开闭进程的时间,也一定程度上能够实现并发效果
四.信号量和进程池的区别
进程池是多个需要被执行的任务在进程池外面排队等待获取进程对象去执行自己,而信号量是一堆进程等待着去执行一段逻辑代码。
信号量,里面有锁,不能控制创建多少个进程,但是可以控制同时多少个进程能够执行,但是进程池能控制你可以创建多少个进程。
举例:就像那些开大车拉煤的,信号量是什么呢,就好比我只有五个车道,你每次只能过5辆车,但是不影响你创建100辆车,但是进程池相当于什么呢?相当于你只有5辆车,每次5个车拉东西,拉完你再把车放回来,给别的人拉煤用