生产消费模型初步

#产生两个子进程,Queue可以在子进程之间传递消息
from multiprocessing import Queue,Process
import random
import time
#队列是进程安全的,队列里的数据只能被一个进程获取,所有q.put(None)只对应一个进程,所以要放两个q.put(None)
def producer(name, food, q):
for i in range(10):
time.sleep(random.randint(1,3))
f = ('%s生产了%s%s' %(name,food,i))
print(f)
q.put(f)
def consume(q,name):
while True:
food = q.get()
if food is None:
print('%s获取了个一个空'%name)
break
print('\033[31m%s消费了%s\033[0m' % (name, food))
time.sleep(random.randint(1,3)) if __name__ == '__main__':
q = Queue(20) #Queue可以在进程间传递数据
p = Process(target=producer, args=('Egon','包子',q))
p2 = Process(target=producer, args=('WuSir', '泔水', q))
p.start()
p2.start()
c = Process(target=consume, args=(q,'Alex'))
c2 = Process(target=consume, args=(q,'jinboss'))
c.start()
c2.start()
p.join()#使得主进程感知P,P2的结束
p2.join()
q.put(None)
q.put(None)

利用JoinableQueue改进生产消费模型

  • 前一版的主要问题是不知道生产者和消费者的数量不可确定
#产生两个子进程,Queue可以在子进程之间传递消息
from multiprocessing import Process, JoinableQueue
import random
import time
#队列是进程安全的,队列里的数据只能被一个进程获取,所有q.put(None)只对应一个进程,所以要放两个q.put(None)
def producer(name, food, q):
for i in range(10):
time.sleep(random.randint(1,3))
f = ('%s生产了%s%s' %(name,food,i))
print(f)
q.put(f)
q.join() #感知一个队列中的数据全部被执行完毕,阻塞,直至所有数据处理完毕
#增加了join后,生产者得等到消费者把生产的数据都消费了才结束
def consume(q,name):
while True:
food = q.get()
if food is None:
print('%s获取了个一个空'%name)
break
print('\033[31m%s消费了%s\033[0m' % (name, food))
time.sleep(random.randint(1,3))
q.task_done() #提交取出数据已完成的信号, count-1 if __name__ == '__main__':
q = JoinableQueue(20) #Queue可以在进程间传递数据
p = Process(target=producer, args=('Egon','包子',q))
p2 = Process(target=producer, args=('WuSir', '泔水', q))
p.start()
p2.start()
c = Process(target=consume, args=(q,'Alex'))
c2 = Process(target=consume, args=(q,'jinboss'))
c.daemon = True #关键步骤
c2.daemon = True #主进程中代码执行完毕之后,会自动结束,这两个守护进程会随着
#p,p2的进程的结束而结束
c.start()
c2.start()
p.join()#主进程感知P,P2的结束
p2.join()
# q.put(None)
# q.put(None) #首先在消费者这端:
# 每次获取一个数据
# 处理一个数据
# 发送一个记号:标志一个数据被处理成功 #在生产者这一端:
# 每一次生产一个数据
# 且每一次生产的数据都放在队列中
# 在队列中刻上一个记号
# 当生产者全部生产完毕之后
# 发送Join信号,标志着生产者已经停止生产数据了, 且要等待之前被刻上记号的数据都被消费完
# 当数据都被处理完是, join阻塞结束 #consumer中把所有的任务消耗完
#producer端的join感知到,停止阻塞
#所有的producer进程结束
#主进程的P.join结束
#主进程代码结束
#守护进程(消费者进程)跟着结束

Python并发编程-生产消费模型的更多相关文章

  1. python 并发编程 多路复用IO模型

    多路复用IO(IO multiplexing) 这种IO方式为事件驱动IO(event driven IO). 我们都知道,select/epoll的好处就在于单个进程process就可以同时处理多个 ...

  2. python 并发编程 阻塞IO模型

    阻塞IO(blocking IO) 在linux中,默认情况下所有的socket都是blocking,一个典型的读操作流程大概是这样: 当用户进程调用了recvfrom这个系统调用,kernel内核就 ...

  3. python 并发编程 异步IO模型

    异步IO(Asynchronous I/O) Linux下的asynchronous IO其实用得不多,从内核2.6版本才开始引入.先看一下它的流程: 用户进程发起read操作之后,立刻就可以开始去做 ...

  4. python 并发编程 io模型 目录

    python 并发编程 IO模型介绍 python 并发编程 socket 服务端 客户端 阻塞io行为 python 并发编程 阻塞IO模型 python 并发编程 非阻塞IO模型 python 并 ...

  5. Python并发编程04 /多线程、生产消费者模型、线程进程对比、线程的方法、线程join、守护线程、线程互斥锁

    Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线程join.守护线程.线程互斥锁 目录 Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线 ...

  6. Python并发编程二(多线程、协程、IO模型)

    1.python并发编程之多线程(理论) 1.1线程概念 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程(流水线的工作需要电源,电源就相当于 ...

  7. Python并发编程系列之多线程

    1 引言 上一篇博文详细总结了Python进程的用法,这一篇博文来所以说Python中线程的用法.实际上,程序的运行都是以线程为基本单位的,每一个进程中都至少有一个线程(主线程),线程又可以创建子线程 ...

  8. python并发编程&多进程(二)

    前导理论知识见:python并发编程&多进程(一) 一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_cou ...

  9. 快速了解Python并发编程的工程实现(上)

    关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...

随机推荐

  1. 对java中继承、接口、组合的思考

    1.在c++中有继承和多重继承,而java中只有单继承.继承的好处在于可以复用一些东西,但缺陷在于后续不好扩展.此外,可读性方面继承也不好. 2.java中多了一个接口的概念,而接口的功能和其名字表达 ...

  2. 782C. Andryusha and Colored Balloons DFS

    Link 题意: 给出一棵树,要求为其染色,并且使任意节点都不与距离2以下的节点颜色相同 思路: 直接DFS.由某节点出发的DFS序列,对于其个儿子的cnt数+1,那么因为DFS遍历的性质可保证兄弟结 ...

  3. json属性名为什么要双引号?

    原因一: 更加规范,利于解析 原因二: 避免class等关键字引起的不兼容问题 原因三: 可能也是最隐晦的: var a = 00; var b = {00: 12}; a in b; --> ...

  4. [csp-201809-3]元素选择器-编译原理

    声明:同样是参考照抄hyh学长的代码!(有问题我马上删这篇emm 题目链接:http://118.190.20.162/view.page?gpid=T77 题面: 这棵树的样子(同样是来自学长的图) ...

  5. vue-router.esm.js?fe87:16 [vue-router] Route with name 'page' does not exist

    本文地址:http://www.cnblogs.com/veinyin/p/7910525.html 我的路由配置 { path: '/page', name: page, component: pa ...

  6. 【leetcode 简单】第十四题 最后一个单词的长度

    给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度. 如果不存在最后一个单词,请返回 0 . 说明:一个单词是指由字母组成,但不包含任何空格的字符串. 示例: 输入: &quo ...

  7. JSP分页之结合Bootstrap分页插件进行简单分页

    结合Bootstrap的分页插件实现分页,其中策略是每次显示5个按钮,然后根据当前页的不同来进行不同的显示: 1. 当前页<3,如果当前页大于5页就显示前五页,不然就显示1~totalPage. ...

  8. favico.js笔记

    1. favicon.js是什么 一个js库可以使用徽标.图像.视频等来设置网页的favicon,即网页标题栏上的小图标. 2. 如何使用 2.1 使用徽标 basic demo: <!DOCT ...

  9. Spring提供的iBatis的SqlMap配置

    1.    applicationContext.xml <!-- Spring提供的iBatis的SqlMap配置--> <bean id="sqlMapClient&q ...

  10. python实战===python程序打包成exe

    推荐PyInstaller项目www.pyinstaller.org   安装方法: 先跑pip install pywin32再跑pip install pyinstaller即可 可用一句命令打包 ...