网络编程——生产者,消费者模型,管道

生产者消费者模型

  主要是为了解耦

  借助队列来实现生产者消费者模型

  栈:先进后出(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。

原文地址:https://www.cnblogs.com/Loren2o/p/9519170.html