import time
import random
from multiprocessing import Process,Queue def consumer(q,name):
while True:
print('\033[31m%s吃了%s\033[0m'%(name,q.get()))  # 如果队列中没有数据了,q.get()方法会一直阻塞
time.sleep(random.randint(1, 3)) def producer(q,food,name): for i in range(10):
time.sleep(random.randint(1, 3))
f = '%s 生产的 %s%i' % (name, food, i)
print(f)
q.put(f) if __name__ == '__main__':
q = Queue(20)
p = Process(target=producer,args=(q,'包子','Egon'))
p1 = Process(target=producer, args=(q, '泔水', 'jinboss'))
c1 = Process(target=consumer, args=(q, 'alex'))
c2 = Process(target=consumer, args=(q, '娜扎'))
p.start()
p1.start()
c1.start()
c2.start()
  q.put(None)
  q.put(None)
这样是有问题的,因为对列中没有了数据,但是consumer函数还在一个q.get()取数据,但是producter已经生产完毕,所以或一值阻塞,
解决问题的方法:
在末尾添加 q.put(None) 然后在consumer中的取得的数据进行判断,为None就break。
但是这样很麻烦,有多少个consumer就要放几个None 使用JoinableQueue,可以解决这个问题
import time
import random
from multiprocessing import Process,JoinableQueue def consumer(name,q):
while True:
f = q.get()
print('\033[31m%s 吃了 %s\033[0m'%(name,f))
time.sleep(random.randint(1, 3))
q.task_done() # 每一次取得一个数据,处理完成后,返回的一个标志,就相当于一个计数器,每次-1 def producter(name,food,q):
for i in range(10):
f = '%s 生产了 %s%i'%(name,food,i)
print('%s 生产了 %s%i'%(name,food,i))
q.put(f)
time.sleep(random.randint(1,3))
q.join() # 阻塞 直到队列中的数据都被处理完成后,producter进程才结束
# 一般是代码执行完毕就结束,q.join(),感知队列数据的状态,处理完成后,结束
if __name__ == '__main__':
q = JoinableQueue() p1 = Process(target=producter,args=('Egon','包子',q))
p2 = Process(target=producter,args=('nazhe','包子',q))
c1 = Process(target=consumer,args=('alex',q))
c2 = Process(target=consumer,args=('jinboss',q))
p1.start()
p2.start()
c1.daemon = True  # 守护进程,随着主进程代码的执行完毕后,才结束
c2.daemon = True
c1.start()
c2.start()
p1.join()      # 感知一个子进程的结束,不结束就一直等着
p2.join()
'''
在消费者这一端:
每次处理一个数据
处理一个数据
发送一个记号:标志一个数据被处理完成
在生产者端:
每次生产一个数据
且每次生产的数据都放入队列中
每放入一个数据,就刻一个记号
当生产者全部生产完毕后
join信号:已经停止生产数据 ,进入阻塞状态
但是进程不会结束,且要等到之前存数据时,课上的记号被消费完,否则就一直阻塞
当数据都被处理完毕时,join阻塞结束 consumer 中把所有的数据消耗完
producter 端的join就会感知到,停止阻塞
所有的producter进程都结束之后
主进程中的p.join()方法停止阻塞
主进程代码执行完毕
守护进程(消费者的进程)结束 '''

												

事件Event实现消费者模型的更多相关文章

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

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

  2. Python 之并发编程之进程下(事件(Event())、队列(Queue)、生产者与消费者模型、JoinableQueue)

    八:事件(Event()) # 阻塞事件:    e = Event() 生成事件对象e    e.wait() 动态给程序加阻塞,程序当中是否加阻塞完全取决于该对象中的is_set() [默认返回值 ...

  3. Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型

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

  4. 进程同步控制(锁,信号量,事件), 进程通讯(队列和管道,生产者消费者模型) 数据共享(进程池和mutiprocess.Pool模块)

    参考博客 https://www.cnblogs.com/xiao987334176/p/9025072.html#autoid-1-1-0 进程同步(multiprocess.Lock.Semaph ...

  5. python 全栈开发,Day39(进程同步控制(锁,信号量,事件),进程间通信(队列,生产者消费者模型))

    昨日内容回顾 python中启动子进程并发编程并发 :多段程序看起来是同时运行的ftp 网盘不支持并发socketserver 多进程 并发异步 两个进程 分别做不同的事情 创建新进程join :阻塞 ...

  6. Python学习笔记——进阶篇【第九周】———线程、进程、协程篇(队列Queue和生产者消费者模型)

    Python之路,进程.线程.协程篇 本节内容 进程.与线程区别 cpu运行原理 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Ev ...

  7. 进程,线程,GIL,Python多线程,生产者消费者模型都是什么鬼

    1. 操作系统基本知识,进程,线程 CPU是计算机的核心,承担了所有的计算任务: 操作系统是计算机的管理者,它负责任务的调度.资源的分配和管理,统领整个计算机硬件:那么操作系统是如何进行任务调度的呢? ...

  8. python2.0_s12_day9之day8遗留知识(queue队列&生产者消费者模型)

    4.线程 1.语法 2.join 3.线程锁之Lock\Rlock\信号量 4.将线程变为守护进程 5.Event事件 * 6.queue队列 * 7.生产者消费者模型 4.6 queue队列 que ...

  9. 进击的Python【第九章】:paramiko模块、线程与进程、各种线程锁、queue队列、生产者消费者模型

    一.paramiko模块 他是什么东西? paramiko模块是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 先来个实例: import param ...

随机推荐

  1. [LeetCode] Basic Calculator IV 基本计算器之四

    Given an expression such as expression = "e + 8 - a + 5" and an evaluation map such as {&q ...

  2. 远程连接ubuntu mysql出现2003错误 cant connect to mysql(转载)

    不多说直接上代码 1.在控制台输入,进入mysql目录下, sudo su //进入root权限 cd /etc/mysql 2.打开my.cnf文件,找到 bind-address = 127.0. ...

  3. ffmpeg 转换 mp4 成 flv

    参考资料: https://addpipe.com/blog/flv-to-mp4/ ffmpeg -i demo.mp4 -c:v libx264 -crf 19 demo.flv 或者 ffmpe ...

  4. 四、XML语言学习(2)

    XML约束之DTD 1.XML都是用户自定义标签,若出现小小的错误,软件程序将不能正确地获取文件中的内容而报错.XML技术中,可以编写一个文档来约束一个XML的书写规范,这个文档称之为约束格式良好的X ...

  5. thinkphp 多图片上传 单图片上传

    不管是单图片上传还是多图片上传都必须要引用这两个js 下载地址 链接:http://pan.baidu.com/s/1eStkUt0 密码:asvo <script src="Publ ...

  6. dict的基本使用

    语法如下: dict1 = {'name':'huangmeiling','age':10,'address':'nanjing'} #print(dir(dict1)) # 获取到所有的key值 # ...

  7. 转 基于Excel参数化你的Selenium2测试

    转载:https://blog.csdn.net/zhusongziye/article/details/80100375 前言 今天我们就如何使用xlrd模块来进行python selenium2 ...

  8. windows系统dos下查看无线网密码

    (1)采用命令:netsh wlan show profiles 查看电脑连接过的无线网: (2)采用命令:netsh wlan show profile name ="wifi 名字&qu ...

  9. Hyper-v带宽限制以及验证工具

    最近在做项目的性能测试时,需要模拟网络的带宽来控制文件的上传速度.按照以前的方式方法,我们一般会使用工具 softperfect bandwidth manager 来模拟上下行的带宽. 官网地址 h ...

  10. mimikaz常用命令

    常用命令,留着自己使用的时候方便查找 mimikatz是一款功能强大的轻量级调试神器,通过它你可以提升进程权限注入进程读取进程内存,当然他最大的亮点也是让阿刚最感兴趣的就是他可以直接从 lsass中获 ...