1.队列的使用:
  队列引用的前提: 多个进程对同一块共享数据的修改:要从硬盘读文件,慢,还要考虑上锁:
   所以就出现了 队列 和 管道 都在内存中(快); 队列 = 管道 + 上锁   用队列的目的:
  进程间通信(IPC),队列可以放任意类型的数据,应该放小东西,
  q = Queue(3)
  get put full empty   队列作用:
   多个进程之间通信使用的,一个进程将数据放到队列里面,另外一个进程从队列里面取走数据,干的是进程之间通信的活
 from multiprocessing import Queue

 q = Queue(3)
q.put('hello')
q.put({'a':1})
q.put([3,3,3]) print(q.full()) # 查看队列是否满了
# q.put(2) # 这里会卡住,直到队列中被取走一个 print(q.get())
print(q.get())
q.put(2)
print(q.get())
print(q.get())
print(q.empty()) # 查看队列是否为空
print(q.get()) # 取完数据后,再取,就卡住了
2.生产者消费者模型:
  生产者:
   生产者指的是生产数据的任务
  消费者:
   消费者指的是处理数据的任务   生产者与消费者模型:
   生产者与消费者之间引入一个容器(队列):
  生产者《---》队列《---》消费者   好处:程序解开耦合,生产者与消费者不直接通信
   平衡了生产者与消费者的速度差    生产者:一个进程
  消费者:一个进程
  进程间通信:队列(IPC)   如果生产者,消费者,队列组件都在一台机器上:
   集中式:稳定性差,性能问题差   分布在多台机器上:
   Rabbitmq 用它来实现生产者,消费者模型
 from multiprocessing import Process,Queue
import time def producer(q):
for i in range(10):
res = '包子%s'%i
time.sleep(0.5)
print('生产者生产了%s'%res) q.put(res) def consumer(q):
while True:
res = q.get()
if not res:break
time.sleep(1)
print('消费者吃了%s'%res) if __name__ == "__main__":
# 容器
q = Queue() # 生产者们
p1 = Process(target=producer,args=(q,))
p2 = Process(target=producer, args=(q,))
p3 = Process(target=producer, args=(q,)) # 消费者们
c1 = Process(target=consumer,args=(q,))
c2 = Process(target=consumer,args=(q,)) p1.start()
p2.start()
p3.start()
c1.start()
c2.start() p1.join()
p2.join()
p3.join()
q.put(None) # 两个消费者,所以放两个None
q.put(None) print('主')
3.JoinableQueue:
q = JoinableQueue()
q.join()
q.task_done()
 from multiprocessing import Process,Queue,JoinableQueue
import time def producer(q):
for i in range(2):
res = '包子%s'%i
time.sleep(0.5)
print('生产者生产了%s'%res) q.put(res)
q.join() # 等待队列为空 def consumer(q):
while True:
res = q.get()
if not res:break
time.sleep(1)
print('消费者吃了%s'%res)
q.task_done() # 消费者发信号,任务结束 if __name__ == "__main__":
# 容器
q = JoinableQueue() # 生产者们
p1 = Process(target=producer,args=(q,))
p2 = Process(target=producer, args=(q,))
p3 = Process(target=producer, args=(q,)) # 消费者们
c1 = Process(target=consumer,args=(q,))
c2 = Process(target=consumer,args=(q,))
c1.daemon = True # 消费者没有存在的必要,设为守护进程
c2.daemon = True p1.start()
p2.start()
p3.start()
c1.start()
c2.start() p1.join()
p2.join()
p3.join() print('主')
												

并发编程 - 进程 - 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. 关于浏览器对静态HTML页面的缓存问题

    症状: 刚才为了测试TOMCAT的BASIC安全验证,修改了tomcat-users.xml和/WEB-INF/web.xml之后进行测试,<url-pattern>/*<url-p ...

  2. linux服务器 IE中ico 不能正常显示

    问题: mime_type: image/vnd.microsoft.icon 的,但发现在 IE 下面,直接打开 icon 的地址,图标不能正常显示 1.将ico放在windows服务器上,直接访问 ...

  3. 服务器操作系统应该选择 Debian/Ubuntu 还是 CentOS?

    早期,我们使用 Debian 作为服务器软件,后来转向了CentOS,主要原因如下: 1.CentOS/RHEL的生命周期是7年,基本上可以覆盖硬件的生命周期,也就意味着一个新硬件安装以后,不用再次安 ...

  4. 第二百七十五节,MySQL数据库安装和介绍

    MySQL数据库安装 一.概述 1.什么是数据库 ? 答:数据的仓库,称其为数据库 2.什么是 MySQL.Oracle.SQLite.Access.MS SQL Server等 ? 答:他们均是一种 ...

  5. 【BZOJ】1072: [SCOI2007]排列perm(状压dp+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1072 首先无限膜拜题解orz表示只会暴力orz 数据那么小我竟然想不到状压! orz 这种题可以取模 ...

  6. POJ 3181 Dollar Dayz 01全然背包问题

    01全然背包问题. 主要是求有多少种组合.二维dp做的人多了,这里使用一维dp就能够了. 一维的转换方程:dp[j] = dp[j-i] + dp[j];当中i代表重量,j代表当前背包容量. 意思就是 ...

  7. Think Python: How to Think Like a Computer Scientist

    Think Python: How to Think Like a Computer Scientist:http://greenteapress.com/thinkpython/html/index ...

  8. (转)c指针问题

    字符串常量问题: http://blog.csdn.net/zhongyili_sohu/article/details/8084188 1. 常量字符串 在代码里直接出现的”abcdef”这种字符串 ...

  9. 在PHP项目中,每个类都要有对应的命名空间,为什么?

    语法: namespace  Admin\Controller; 功能: 命名空间主要用来区分控制器属于哪个模块下,好区分,更有利于项目的维护:

  10. iOS开发之-- 设置启动图片

    一.添加启动图片 点击Assets.xcassets进入图片管理,右击,弹出"New Launch Image"或点下面的+号创建Launch Image: 如图,右侧的勾选可以让 ...