Python并发编程-生产消费模型
生产消费模型初步
#产生两个子进程,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并发编程-生产消费模型的更多相关文章
- python 并发编程 多路复用IO模型
多路复用IO(IO multiplexing) 这种IO方式为事件驱动IO(event driven IO). 我们都知道,select/epoll的好处就在于单个进程process就可以同时处理多个 ...
- python 并发编程 阻塞IO模型
阻塞IO(blocking IO) 在linux中,默认情况下所有的socket都是blocking,一个典型的读操作流程大概是这样: 当用户进程调用了recvfrom这个系统调用,kernel内核就 ...
- python 并发编程 异步IO模型
异步IO(Asynchronous I/O) Linux下的asynchronous IO其实用得不多,从内核2.6版本才开始引入.先看一下它的流程: 用户进程发起read操作之后,立刻就可以开始去做 ...
- python 并发编程 io模型 目录
python 并发编程 IO模型介绍 python 并发编程 socket 服务端 客户端 阻塞io行为 python 并发编程 阻塞IO模型 python 并发编程 非阻塞IO模型 python 并 ...
- Python并发编程04 /多线程、生产消费者模型、线程进程对比、线程的方法、线程join、守护线程、线程互斥锁
Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线程join.守护线程.线程互斥锁 目录 Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线 ...
- Python并发编程二(多线程、协程、IO模型)
1.python并发编程之多线程(理论) 1.1线程概念 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程(流水线的工作需要电源,电源就相当于 ...
- Python并发编程系列之多线程
1 引言 上一篇博文详细总结了Python进程的用法,这一篇博文来所以说Python中线程的用法.实际上,程序的运行都是以线程为基本单位的,每一个进程中都至少有一个线程(主线程),线程又可以创建子线程 ...
- python并发编程&多进程(二)
前导理论知识见:python并发编程&多进程(一) 一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_cou ...
- 快速了解Python并发编程的工程实现(上)
关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...
随机推荐
- tomcat8在centos7.5下配置开机启动
本文参考这篇文章 一.在/etc/init.d下新建一个文件tomcat,并添加内容如下: #!/bin/sh # chkconfig: 345 99 10 # description: Auto-s ...
- Linux两台服务器上互传文件
主服务器:192.168.100.30: 文件所在服务器:192.168.100.31: 1. 在主服务上拷贝文件: #scp root@192.168.100.31:/home/a.txt /hom ...
- HTML 5 Web 存储:localStorage和sessionStorage
本文内容摘自http://www.w3school.com.cn/ 在客户端存储数据 HTML5 提供了两种在客户端存储数据的新方法: localStorage - 没有时间限制的数据存储 sessi ...
- 针对移动设备的CSS3布局
针对移动设备的CSS3布局 一些专业人士预测五年内移动设备将击败普通电脑成为网页浏览领域的霸主,不管这个预言是否应验,让网页在移动设备上较好的显示已经成为网页设计师和开发者的重要任务,本教程学习用CS ...
- 【洛谷P2676】超级书架
题目描述 Farmer John最近为奶牛们的图书馆添置了一个巨大的书架,尽管它是如此的大,但它还是几乎瞬间就被各种各样的书塞满了.现在,只有书架的顶上还留有一点空间. 所有N(1 <= N & ...
- 【Linux 命令】fping ping 包间隔时间详解
服务器间检查会用到fping的命令,期间遇到了一个问题,需要将ping包间的间隔时间设置为100毫秒,查看fping -h看下,找到了-i和-p两个参数: 看到这两个参数,我当时的表情是这样的: 看不 ...
- 2017ACM暑期多校联合训练 - Team 3 1005 RXD and dividing
题目链接 Problem Description RXD has a tree T, with the size of n. Each edge has a cost. Define f(S) as ...
- Vue 脱坑记
问题汇总 Q:安装超时(install timeout) 方案有这么些: cnpm : 国内对npm的镜像版本 /* cnpm website: https://npm.taobao.org/ */ ...
- Jsoup爬取带登录验证码的网站
今天学完爬虫之后想的爬一下我们学校的教务系统,可是发现登录的时候有验证码.因此研究了Jsoup爬取带验证码的网站: 大体的思路是:(需要注意的是__VIEWSTATE一直变化,所以我们每个页面都需要重 ...
- 使用JSON语法创建JS对象(重要)
JS对象的键值可以加单引号或者不加或者加双引号 JSON语法提供了一种更简单的方式来创建对象,可以避免书写函数,也可避免用new关键字,可以直接创建一个JS对象,使用一个花括号,然后将每个属性写成&q ...