python并行任务之生产消费模式
一. 生产者/消费者模式
概念:生产者产生一块数据,放到buffer中,与此同时,消费者在从buffer中取出并消耗这些数据
理解:像生活中厂家生产出产品,顾客购买消耗这些产品,buffer就是存放商品的仓库。
二. 生产者/消费者模式在python中的实现
相关模块:Queue模块
简单介绍:Python中,队列是线程间最常用的交换数据的形式之一。Queue模块是python中提供队列操作的模块。
原理:它创建一个"队列"对象(即用于存放数据的buffer), 然后不断产生数据并存入该"队列",同时也在不断
地从该队列中取出数据。
具体函数:
(1)创建一个队列对象
>>> import Queue
>>> 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-8 import threading, time
import Queue #导入消息队列模块
import random #导入随机数模块,是为了模拟生产者与消费者速度不一致的情形
q = Queue.Queue() #实例化一个队列对象,当有多个线程共享一个东西的时候就可以用它了 def Producer(): #生产者函数
for i in range(20):
q.put(i) #将结果放入消息队列中
print '[+] Product %s' %i
time.sleep(random.randrange(3)) #生产者的生产速度,3s内
def Consumer(): #消费者函数
count = 0
while count < 20:
data = q.get() #取用消息队列中存放的结果
print '[-] Consume %s' %data
count += 1
time.sleep(random.randrange(4)) #消费者的消费速度,4s内 producter = threading.Thread(target = Producer)
consumer = threading.Thread(target = Consumer) producter.start()
consumer.start()
运行结果:

python并行任务之生产消费模式的更多相关文章
- 使用Condition实现多线程之间调用(生产消费模式)
一,object 类的wait(),notify()和notifyAll() Java 线程类也是一个object 类,它的实例都继承自java.lang.Thread 或其子类.wait(),not ...
- Java的多线程实现生产/消费模式
Java的多线程实现生产/消费模式 在Java的多线程中,我们经常使用某个Java对象的wait(),notify()以及notifyAll() 方法实现多线程的通讯,今天就使用Java的多线程实现生 ...
- 异步简析之BlockingCollection实现生产消费模式
目前市面上有诸多的产品实现队列功能,比如Redis.MemCache等... 其实c#中也有一个基础的集合类专门用来实现生产/消费模式 (生产模式还是建议使用Redis等产品) 下面是官方的一些资料和 ...
- 使用C#的泛型队列Queue实现生产消费模式
本篇体验使用C#的泛型队列Queue<T>实现生产消费模式. 如果把生产消费想像成自动流水生产线的话,生产就是流水线的物料,消费就是某种设备对物料进行加工的行为,流水线就是队列. 现在,要 ...
- Python Django的生产部署方式
本地化部署的Django有很大的局限性,无法用于生产环境,比如无法抗住多并发,无法长时间的运行,容易造成网页无响应的问题.所以如何将Django部署到真正的生产环境中,让其能够真正的像正常的网页一样工 ...
- 用map函数来完成Python并行任务的简单示例
众所周知,Python的并行处理能力很不理想.我认为如果不考虑线程和GIL的标准参数(它们大多是合法的),其原因不是因为技术不到位,而是我们的使用方法不恰当.大多数关于Python线程和多进程的教材虽 ...
- 生产-消费模式的synchronized和lock实现(十)
lock: package com.net.thread.lock; import java.util.concurrent.locks.Condition; import java.util.con ...
- Kafka 通过python简单的生产消费实现
使用CentOS6.5.python3.6.kafkaScala 2.10 - kafka_2.10-0.8.2.2.tgz (asc, md5) 一.下载kafka 下载地址 https://ka ...
- Python Queue实现生产与消费
Python Queue模块详解 from:https://blog.linuxeye.com/334.html Python中,队列是线程间最常用的交换数据的形式.Queue模块是提供队列操作的模块 ...
随机推荐
- linux面试题集锦2《转》
一.填空题: 1. 在Linux系统中,以 文件 方式访问设备 . 2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统. 3. Linux文件系统中每个文件用 索引节点来 ...
- CentOS 7安装redis及php扩展
安装remi源 # wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm # rpm -Uvh remi-release-7 ...
- hdu 3842 Machine Works(cdq分治维护凸壳)
题目链接:hdu 3842 Machine Works 详细题解: HDU 3842 Machine Works cdq分治 斜率优化 细节比较多,好好体会一下. 在维护斜率的时候要考虑x1与x2是否 ...
- Token注解防止表单的重复提交
注解的一些基础: 参见http://blog.csdn.net/duo2005duo/article/details/50505884和 http://blog.csdn.net/duo2005duo ...
- ffmpeg的安装--opencv视频处理必备
安装yasm(ffmpeg必备)wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gztar xzvf yasm-1. ...
- asp.net mvc + mysql + ef6
1.通过NuGet包管理器安装:EntityFramework6.1.3.MySql.Data.Entity6.9.9 2.添加新建项→ADO.NET实体对象模型(命名MyContext)→空Code ...
- [MFC美化] USkin使用详解-使用方法
该种皮肤库资料很少,用法与前面几种类似. 它主要有:USkin.dll ,USkin.lib,USkin.h和Sakura.msstyles这四个文件.皮肤格式是.u3.SkinBuilder是USk ...
- 关于泛型中<T extends comparable>的理解
public static <T extends Comparable> T min(List<T> t); 对于上面定义的泛型方法min中,Comparable指的是一个接口 ...
- 获取XMLHttpRequest对象
//创建一个XMLHttpRequest对象 ,利用此对象与服务器进行通信 是AJAX技术的核心 /////////////////////////////////////////////////// ...
- CentOS 7 systemd service开机启动设定
#vi /etc/systemd/system/xxx.service [Unit] Description=startup script test [Service] Type=simple Exe ...