zoukankan      html  css  js  c++  java
  • 网络编程——生产者,消费者模型,管道

    生产者消费者模型

      主要是为了解耦

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

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

  • 相关阅读:
    Cookies 和 Session的区别
    List接口、Set接口和Map接口
    Java NIO:IO与NIO的区别
    NIO与传统IO的区别
    Java中堆内存和栈内存详解
    Java序列化与反序列化
    maven搭建
    深入研究java.lang.ThreadLocal类
    SQL 优化经验总结34条
    数据库事务的四大特性以及事务的隔离级别
  • 原文地址:https://www.cnblogs.com/Loren2o/p/9519170.html
Copyright © 2011-2022 走看看