进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或打印同一个终端,是没有问题的
加锁是将程序由并发转换为串行,牺牲运行效率,避免竞争
加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,降低速度,保证数据安全
文件共享可以实现进程间通信,但问题是:
1.效率低(共享数据基于文件,文件是硬盘上的数据)
2.需要自己加锁处理
mutiprocessing模块提供基于消息的IPC通信机制:队列和管道
1.队列和管道都是将数据存放在内存中
2.队列又是基于(管道加锁)实现的
应避免使用共享数据,尽可能使用消息传递和队列,避免处理复杂的同步和锁的问题,而且进程增加可以获得更好的可扩展性
进程之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种格式:队列和管道,这两种方式都是使用消息传递的
Queue(maxsize):创建共享的进程队列,Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递
maxsize是队列中允许最大项数,省略则无大小限制
q.put()方法用以插入数据到队列中,put方法还有两个可选参数,blocked和timeout,如果blocked为True(默认值),并且timeout为正值,那么在等待的时间内没有取到任何元素,会抛出Que.Empty异常,如果blocked为False,有两种情况存在,如果Queue有一个值可用,则会立即返回该值,否则队列为空,则会立即抛出Queue.Empty异常
q.getnowait()同q.get(False)
q.put_nowait():同q.put(False)
q.empty():调用此方法时,q为空则返回True,该结果不可靠,比如在返回True的过程中,如果队列中又加入了项目
q.full():调用此方法时q已满则会返回True,该结果不可靠,比如在返回True的过程中,如果队列中的项目被取走
q.qsize():返回队列中目前项目的正确数量,结果不可靠,
生产者消费者模型:
生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题,生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力
生产者消费者模型总结:
程序中有两类角色:
一类负责生产数据(生产者)
一类负责处理数据(消费者)
引入生产者消费者模型为了解决的问题是:
平衡生产者与消费者之间的工作能力,从而提高程序整体处理数据的速度
如何实现:
生产者<====>队列<====>消费者
生产者消费者模型实现类程序的解耦合