一. 生产者/消费者模式

概念:生产者产生一块数据,放到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并行任务之生产消费模式的更多相关文章

  1. 使用Condition实现多线程之间调用(生产消费模式)

    一,object 类的wait(),notify()和notifyAll() Java 线程类也是一个object 类,它的实例都继承自java.lang.Thread 或其子类.wait(),not ...

  2. Java的多线程实现生产/消费模式

    Java的多线程实现生产/消费模式 在Java的多线程中,我们经常使用某个Java对象的wait(),notify()以及notifyAll() 方法实现多线程的通讯,今天就使用Java的多线程实现生 ...

  3. 异步简析之BlockingCollection实现生产消费模式

    目前市面上有诸多的产品实现队列功能,比如Redis.MemCache等... 其实c#中也有一个基础的集合类专门用来实现生产/消费模式 (生产模式还是建议使用Redis等产品) 下面是官方的一些资料和 ...

  4. 使用C#的泛型队列Queue实现生产消费模式

    本篇体验使用C#的泛型队列Queue<T>实现生产消费模式. 如果把生产消费想像成自动流水生产线的话,生产就是流水线的物料,消费就是某种设备对物料进行加工的行为,流水线就是队列. 现在,要 ...

  5. Python Django的生产部署方式

    本地化部署的Django有很大的局限性,无法用于生产环境,比如无法抗住多并发,无法长时间的运行,容易造成网页无响应的问题.所以如何将Django部署到真正的生产环境中,让其能够真正的像正常的网页一样工 ...

  6. 用map函数来完成Python并行任务的简单示例

    众所周知,Python的并行处理能力很不理想.我认为如果不考虑线程和GIL的标准参数(它们大多是合法的),其原因不是因为技术不到位,而是我们的使用方法不恰当.大多数关于Python线程和多进程的教材虽 ...

  7. 生产-消费模式的synchronized和lock实现(十)

    lock: package com.net.thread.lock; import java.util.concurrent.locks.Condition; import java.util.con ...

  8. Kafka 通过python简单的生产消费实现

    使用CentOS6.5.python3.6.kafkaScala 2.10  - kafka_2.10-0.8.2.2.tgz (asc, md5) 一.下载kafka 下载地址 https://ka ...

  9. Python Queue实现生产与消费

    Python Queue模块详解 from:https://blog.linuxeye.com/334.html Python中,队列是线程间最常用的交换数据的形式.Queue模块是提供队列操作的模块 ...

随机推荐

  1. JDK1.8源码阅读系列之一:ArrayList

    本篇随笔主要描述的是我阅读 ArrayList 源码期间的对于 ArrayList 的一些实现上的个人理解,有不对的地方,请指出- 先来看一下 ArrayList 的继承图: 由图可以看出,Array ...

  2. CodeForces 747D Winter Is Coming

    贪心. 只考虑负数的位置,先填间隔较小的,再填间隔较大的.如果填不满就不填,如果有多余就留给最后一个负数到终点这段路. #include<cstdio> #include<cstri ...

  3. servlet的跳转

    首先要有RequestDispatcher对象(由request.getRequestDispatcher(根目录)注意不用谢后缀名java RequestDispatcher dispatcher= ...

  4. Sara Chipps

    "To be a developer you really need to love to learn because you're going to be learning your en ...

  5. 循序渐进看Java web日志跟踪(2)-Java日志API认识

    接触过Java的朋友应该都会知道,java的开源框架百花齐放,实现同样的功能,总能找到几个强大的开源框架来进行选择.在日志方面,Java同样不逊色.除了JDK本身自带的简单的日志工具,java还有如l ...

  6. usaco月赛,2017.1总结

    T1:跳舞的奶牛 大致题意:一个体积为k的舞台能够同时容纳k只奶牛一起跳舞,他们每头奶牛的跳舞时间不同,如果有一只奶牛跳完了第k+1头奶牛就会立刻上场跳舞,当所有奶牛跳完舞以后我们认为这次表演结束.现 ...

  7. jQuery操作radio

    JQuery获取选中的radio $radio = $('input:radio[name="sex"][class="xxxx"]:checked') 获取n ...

  8. 解决 spring mvc 3.+ 结合 hibernate3.+ 使用<tx:annotation-driven>声明式事务无法提交的问题

    spring mvc使用注解方式:service使用@service注解 事务使用@Transactional 事务配置使用 <tx:annotation-driven transaction- ...

  9. java基础3

    包装类:

  10. hdu1032

    #include <iostream> using namespace std; int main() { int a,b,t,i,max; while(cin >> a &g ...