网络编程——生产者,消费者模型,管道
生产者消费者模型
主要是为了解耦
借助队列来实现生产者消费者模型
栈:先进后出(First In Last Out 简称FILO)
队列:先进先出(First In First Out 简称FIFO)
这里需要学习两个模块
(一)
Import queue #不能进行多进程之间的数据传输
from multiprocessing import Queue 借助Queue解决生产者消费者模型
队列是安全的
q = Queue(num)
num : 队列的最大长度
q.get() #阻塞等待获取数据,如果有数据直接获取,如果没有数据,阻塞等待
q.put() #阻塞,如果可以继续往队列中放数据,就直接放,不能放就阻塞等待
q.get_nowait() #不阻塞,如果有数据直接获取,没有数据就报错
q.put_nowait() #不阻塞,如果可以继续往队列中放数据,就直接放,不能放就报错
(二)
from multiprocessing import JoinableQueue #可链接的队列
JoinableQueue 是继承Queue,所以可以使用Queue中的方法
并且JoinableQueue又多了两个方法
q.join() #用于生产者,等待 q.task_done的返回结果,通过返回结果,生产者就能获得消费者当前消费了多少个数据
q.task_done() #用于消费者,是指每消费队列中一个数据,就给join返回一个标识
管道
from multiprocessing import Pipe
con1, con2 - Pipe()
管道是不安全的
管道用于多进程之间通信的一种方式
如果在单进程中使用管道,那么就是con1 收数据,con2发数据
如果是con1发数据,就是con2收数据
如果在多进程中使用管道,那么就必须是父进程使用con1收,子进程就必须使用con2发
父进程使用con1发,子进程就必须使用con2收
父进程使用con2收,子进程就必须使用con1发
父进程使用con2发,子进程就必须使用con1收
在管道中又一个著名的错误EOFError, 是指,父进程中如果关闭了发送端,子进程还继续接收数据,那么就会引发EOFError。