python并行任务之生产消费模式
一. 生产者/消费者模式
概念:生产者产生一块数据,放到buffer中,与此同时,消费者在从buffer中取出并消耗这些数据
理解:像生活中厂家生产出产品,顾客购买消耗这些产品,buffer就是存放商品的仓库。
二. 生产者/消费者模式在python中的实现
相关模块:Queue模块
简单介绍:Python中,队列是线程间最常用的交换数据的形式之一。Queue模块是python中提供队列操作的模块。
原理:它创建一个"队列"对象(即用于存放数据的buffer), 然后不断产生数据并存入该"队列",同时也在不断
地从该队列中取出数据。
具体函数:
(1)创建一个队列对象
1 >>> import Queue 2 >>> q = Queue.Queue()
注:队列长度可为无限或有限。可通过Queue的构造函数的可选参数maxsize来设定队列长度。若maxsize小于1则表示队列长度无限,例:
(2)向队列中存入数据
方法: q.put(item, block=True, timeout=None)
>>> q.put('a')
注:put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为1。
如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。
(3)从队列中取出数据
方法: q.get(block=True, timeout=None)
>>> q.get()
注:get方法可选参数为block,默认为True。
如果队列为空且block为True,get()就使调用线程暂停,直至有项目可用。如果队列为空且block为False,队列将引发Empty异常。
Queue.Queue中常用方法:
q.qsize() 返回队列的大小 q.empty() 如果队列为空,返回True,反之False q.full() 如果队列已满,返回True,反之False。与 maxsize 大小对应 q.get([block[, timeout]]) 获取队列,timeout等待时间 q.get_nowait() 相当q.get(False) 非阻塞 q.put(item,timeout) 写入队列,timeout等待时间 q.put_nowait(item) 相当q.put(item, False) q.task_done() 完成一项工作之后, 函数向任务已经完成的队列发送一个信号 q.join() 表示等到队列为空,再执行别的操作
实例测试:
#!/usr/bin/env python #coding=utf-8import threading, time import Queue #导入消息队列模块 import random #导入随机数模块,是为了模拟生产者与消费者速度不一致的情形 q = Queue.Queue() #实例化一个队列对象,当有多个线程共享一个东西的时候就可以用它了def Producer(): #生产者函数for i in range(20):q.put(i) #将结果放入消息队列中print '[+] Product %s' %itime.sleep(random.randrange(3)) #生产者的生产速度,3s内 def Consumer(): #消费者函数count = 0while count < 20:data = q.get() #取用消息队列中存放的结果print '[-] Consume %s' %datacount += 1time.sleep(random.randrange(4)) #消费者的消费速度,4s内 producter = threading.Thread(target = Producer) consumer = threading.Thread(target = Consumer)producter.start() consumer.start()
运行结果:
python并行任务之生产消费模式相关推荐
- 线程的简单生产消费模式
Student类 package july.star.thread14;/*** Student* @author MoXingJian* @email 939697374@qq.com* @date ...
- 简单生产消费模式的代码流程(Java代码)
Student package july.star.thread12;/*** Student* @author MoXingJian* @email 939697374@qq.com* @date ...
- 异步简析之BlockingCollection实现生产消费模式
目前市面上有诸多的产品实现队列功能,比如Redis.MemCache等... 其实c#中也有一个基础的集合类专门用来实现生产/消费模式 (生产模式还是建议使用Redis等产品) 下面是官方的一些资料和 ...
- python使用kafka生产和消费案例
// confluent_kafka 使用案例 import json from confluent-kafka import Producertopic_name = "" co ...
- python nameko用于生产_用 Python、 RabbitMQ 和 Nameko 实现微服务
"微服务是一股新浪潮" - 现如今,将项目拆分成多个独立的.可扩展的服务是保障代码演变的最好选择.在 Python 的世界里,有个叫做 "Nameko" 的框架 ...
- 如何让nginx执行python代码_生产环境部署Python语言代码(django+uwsgi+nginx)
本文主要向大家介绍了生产环境部署Python语言代码(django+uwsgi+nginx),通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 基础环境不做介绍,在django开发w ...
- python如何训练模型生产_手把手教你用Python构建你的第一个多标签图像分类模型(附案例)...
你正在处理图像数据吗?我们可以使用计算机视觉算法来做很多事情: 对象检测 图像分割 图像翻译 对象跟踪(实时),还有更多-- 这让我思考--如果一个图像中有多个对象类别,我们该怎么办?制作一个图像分类 ...
- NDK学习笔记-多线程与生产消费模式
在做NDK开发的时候,很多情况下都是需要使用多线程的,一方面是提高程序运行效率,另一方面就是防止主线程阻塞 C的多线程 在C语言里,可以通过对于POSIX标准的运用,使得C语言执行多线程 提高程序的执 ...
- Redis实现消息队列之生产消费模式
简单的介绍下消息队列,使用消息队列首先我们得有一个队列,那么这个队列之前讲过就是先进先出的一个数据结构:那么有了队列以后我们还需要有人在队列里面放东西,那么这个放东西的人我们称之为生产者:有了生产者对 ...
最新文章
- mysql存储过程表_mysql 存储过程,表
- pytorch ctcloss 参数详解
- Java精讲:生产者-消费者
- HBase 的存储结构
- 【IT笔试面试题整理】判断链表是否存在环路,并找出回路起点
- Oracle区分中文和英文,oracle中中英文段落划分实现
- scala中的二维数组_Scala中的多维数组
- 硬件创新需要去理解的点(精炼总结)
- 上海纽约大学计算机专业怎样,聚焦|对话上纽大计算机科学教授郭斯瑶
- 递归经典案例汉诺塔 python实现_python实现汉诺塔递归算法经典案例
- 《jdk8u源码分析》jvm.dll接口列表
- 网页端下载喜马拉雅音频
- 氪金玩家逸仙电商的高端困境
- Java Springboot 使用 OpenOffice 实现Excel转PDF
- 微型计算机外文文献,单片机外文文献翻译---微型计算机控制系统
- 【转载】30个高质量但免费的自学网站
- 电动车、船等 机械结构DIY
- 永久删除的文件如何恢复?
- uni-app使用vue-i18n实现国际化(中英文切换)
- smartfroms word编辑_word如何改变smartart word如何编辑smartart
热门文章
- 中波形过于密集_论高速公路波形护栏板外观设计的重要性
- java tomcat数据库连接池_tomcat配置数据库连接池2
- oracle-j2sdk1.8,CDH agent无法安装
- 一次PHP中SQL的Where子句无效问题的解决之旅
- 毕业生,管好你的档案和户口
- mysql密码加强_MySQL密码增强插件
- mysql 双机备份_mysql双机热备详解及延伸备份
- python插值算法实现_图像插值算法Opencv+python实现
- android 编译sdk,android编译sdk
- 找出游戏的必胜的策略(博弈论的学习)