1. 1.队列的使用:
      队列引用的前提: 多个进程对同一块共享数据的修改:要从硬盘读文件,慢,还要考虑上锁:
       所以就出现了 队列 管道 都在内存中(快); 队列 = 管道 + 上锁
  2.  
  3.   用队列的目的:
      进程间通信(IPC),队列可以放任意类型的数据,应该放小东西,
      q = Queue(3)
      get put full empty
  4.  
  5.   队列作用:
       多个进程之间通信使用的,一个进程将数据放到队列里面,另外一个进程从队列里面取走数据,干的是进程之间通信的活
  1. from multiprocessing import Queue
  2.  
  3. q = Queue(3)
  4. q.put('hello')
  5. q.put({'a':1})
  6. q.put([3,3,3])
  7.  
  8. print(q.full()) # 查看队列是否满了
  9. # q.put(2) # 这里会卡住,直到队列中被取走一个
  10.  
  11. print(q.get())
  12. print(q.get())
  13. q.put(2)
  14. print(q.get())
  15. print(q.get())
  16. print(q.empty()) # 查看队列是否为空
  17. print(q.get()) # 取完数据后,再取,就卡住了
  1. 2.生产者消费者模型:
      生产者:
       生产者指的是生产数据的任务
      消费者:
       消费者指的是处理数据的任务
  2.  
  3.   生产者与消费者模型:
       生产者与消费者之间引入一个容器(队列):
      生产者《---》队列《---》消费者
  4.  
  5.   好处:程序解开耦合,生产者与消费者不直接通信
       平衡了生产者与消费者的速度差
  6.  
  7.    生产者:一个进程
      消费者:一个进程
      进程间通信:队列(IPC
  8.  
  9.   如果生产者,消费者,队列组件都在一台机器上:
       集中式:稳定性差,性能问题差
  10.  
  11.   分布在多台机器上:
       Rabbitmq 用它来实现生产者,消费者模型
  1. from multiprocessing import Process,Queue
  2. import time
  3.  
  4. def producer(q):
  5. for i in range(10):
  6. res = '包子%s'%i
  7. time.sleep(0.5)
  8. print('生产者生产了%s'%res)
  9.  
  10. q.put(res)
  11.  
  12. def consumer(q):
  13. while True:
  14. res = q.get()
  15. if not res:break
  16. time.sleep(1)
  17. print('消费者吃了%s'%res)
  18.  
  19. if __name__ == "__main__":
  20. # 容器
  21. q = Queue()
  22.  
  23. # 生产者们
  24. p1 = Process(target=producer,args=(q,))
  25. p2 = Process(target=producer, args=(q,))
  26. p3 = Process(target=producer, args=(q,))
  27.  
  28. # 消费者们
  29. c1 = Process(target=consumer,args=(q,))
  30. c2 = Process(target=consumer,args=(q,))
  31.  
  32. p1.start()
  33. p2.start()
  34. p3.start()
  35. c1.start()
  36. c2.start()
  37.  
  38. p1.join()
  39. p2.join()
  40. p3.join()
  41. q.put(None) # 两个消费者,所以放两个None
  42. q.put(None)
  43.  
  44. print('主')
  1. 3.JoinableQueue:
    q = JoinableQueue()
    q.join()
    q.task_done()
  1. from multiprocessing import Process,Queue,JoinableQueue
  2. import time
  3.  
  4. def producer(q):
  5. for i in range(2):
  6. res = '包子%s'%i
  7. time.sleep(0.5)
  8. print('生产者生产了%s'%res)
  9.  
  10. q.put(res)
  11. q.join() # 等待队列为空
  12.  
  13. def consumer(q):
  14. while True:
  15. res = q.get()
  16. if not res:break
  17. time.sleep(1)
  18. print('消费者吃了%s'%res)
  19. q.task_done() # 消费者发信号,任务结束
  20.  
  21. if __name__ == "__main__":
  22. # 容器
  23. q = JoinableQueue()
  24.  
  25. # 生产者们
  26. p1 = Process(target=producer,args=(q,))
  27. p2 = Process(target=producer, args=(q,))
  28. p3 = Process(target=producer, args=(q,))
  29.  
  30. # 消费者们
  31. c1 = Process(target=consumer,args=(q,))
  32. c2 = Process(target=consumer,args=(q,))
  33. c1.daemon = True # 消费者没有存在的必要,设为守护进程
  34. c2.daemon = True
  35.  
  36. p1.start()
  37. p2.start()
  38. p3.start()
  39. c1.start()
  40. c2.start()
  41.  
  42. p1.join()
  43. p2.join()
  44. p3.join()
  45.  
  46. print('主')
  1.  

并发编程 - 进程 - 1.队列的使用/2.生产者消费者模型/3.JoinableQueue的更多相关文章

  1. python并发编程之多进程(二):互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型

    一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...

  2. python开发进程:互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型

    一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...

  3. 进程部分(IPC机制及生产者消费者模型)和线程部分

    进程部分 一:进程间通信IPC机制:由于进程之间的内存空间是相互隔离的,所以为了进程间的通信需要一个共享的内存空间, 但是共享带来的问题是数据在写的时候就不安全了,所以需要一种机制既有能共享的内存 空 ...

  4. python并发编程-进程池线程池-协程-I/O模型-04

    目录 进程池线程池的使用***** 进程池/线程池的创建和提交回调 验证复用池子里的线程或进程 异步回调机制 通过闭包给回调函数添加额外参数(扩展) 协程*** 概念回顾(协程这里再理一下) 如何实现 ...

  5. 4、网络并发编程--僵尸进程、孤儿进程、守护进程、互斥锁、消息队列、IPC机制、生产者消费者模型、线程理论与实操

    昨日内容回顾 操作系统发展史 1.穿孔卡片 CPU利用率极低 2.联机批处理系统 CPU效率有所提升 3.脱机批处理系统 CPU效率极大提升(现代计算机雏形) 多道技术(单核CPU) 串行:多个任务依 ...

  6. Learning-Python【34】:进程之生产者消费者模型

    一.什么是生产者消费者模型 生产者指的是生产数据的任务,消费者指的是处理数据的任务,在并发编程中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据.同样 ...

  7. 守护进程,进程安全,IPC进程间通讯,生产者消费者模型

    1.守护进程(了解)2.进程安全(*****) 互斥锁 抢票案例3.IPC进程间通讯 manager queue(*****)4.生产者消费者模型 守护进程 指的也是一个进程,可以守护着另一个进程 一 ...

  8. Day034--Python--锁, 信号量, 事件, 队列, 生产者消费者模型, joinableQueue

    进程同步: 1. 锁 (重点)    锁通常被用来实现对共享资源的同步访问.为每一个共享资源创建一个Lock对象,当你需要访问该资源时,调用acquire方法来获取锁对象(如果其它线程已经获得了该锁, ...

  9. 利用multiprocessing.managers开发跨进程生产者消费者模型

    研究了下multiprocessing.managers,略有收获,随笔一篇: 核心思路是构造一个manager进程,这个进程可以通过unix socket或tcp socket与其它进程通信:因为利 ...

随机推荐

  1. win32之全屏窗口

    游戏开发中经常使用会让游戏以全屏窗口的状态运行,下面一个例子就是来实现这个效果的. #include <windows.h> void RegisterMyClass(); LRESULT ...

  2. 绕过IE10直接安装VS2013

    参考资料:http://blog.163.com/qimo601%40126/blog/static/1582209320143354446462/ 这SB设定我就懒得说了,安个IE10要安装N多WI ...

  3. Elasticsearch JVM Heap Size大于32G,有什么影响?

    0.引言 在规划ES部署的时候,会涉及到data node的分配堆内存大小,而Elasticsearch默认安装后设置的内存是1GB,对于任何一个业务部署来说,这个都太小了. 设置Heap Size的 ...

  4. Administrator privileges required for OLE Remote Procedure Call debugging: this feature will not work..

    VC++ 6.0单步调试(F10)出现警告框: 解决方法: 右键VC++ 6.0程序图标

  5. Boost-date_time库学习

    最近开了boost库的学习,就先从日期-时间库开始吧,boost的date_time库是一个很强大的时间库,用起来还是挺方便的. 以下代码只是入门级的简单学习,更详细的资料参考boost源码.  C+ ...

  6. python虚拟环境的使用---virtualenv and virtualenvwrapper

    虚拟环境 virtualenv 常用操作 step1: 安装 : pip install virtualenv step2:新建 : virtualenv venv cd venv activate ...

  7. ASP.NET MVC5 新特性:Attribute路由使用详解

    1.什么是Attribute路由?怎么样启用Attribute路由? 微软在 ASP.NET MVC5 中引入了一种新型路由:Attribute路由,顾名思义,Attribute路由是通过Attrib ...

  8. XDocument简单入门

    [+]   1.什么是XML? 2.XDocument和XmlDocument的区别? 3.XDocument 4.XmlDocument 5.LINQ to XML 6.XML序列化与反序列化 因为 ...

  9. ios 开发之 -- UILabel的text竖行显示

    让UILabel的内容竖行显示,我经常用一下两种方式: 第一种:使用换行符 \n label.text = @"请\n竖\n直\n方\n向\n排\n列"; label.number ...

  10. ORA-00972: 标识符过长

    若是拼接成的sql语句,请查找传递参数时字符型字段是否两边少了引号.