首页 > 代码库 > python并行任务之生产消费模式
python并行任务之生产消费模式
一. 生产者/消费者模式
概念:生产者产生一块数据,放到buffer中,与此同时,消费者在从buffer中取出并消耗这些数据
理解:像生活中厂家生产出产品,顾客购买消耗这些产品,buffer就是存放商品的仓库。
二. 生产者/消费者模式在python中的实现
相关模块:Queue模块
简单介绍:Python中,队列是线程间最常用的交换数据的形式之一。Queue模块是python中提供队列操作的模块。
原理:它创建一个"队列"对象(即用于存放数据的buffer), 然后不断产生数据并存入该"队列",同时也在不断
地从该队列中取出数据。
具体函数:
(1)创建一个队列对象
1 >>> import Queue2 >>> 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,反之Falseq.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, timeimport 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并行任务之生产消费模式