python 提供一个Queue队列,此队列提供了线程同步支持,使用此队列可以很方例实现多生产者和多消费者的先进先出的任务队列。生产者依次存入任务,消费者依次取出任务。
以下是简单事列:
# -*- coding:gbk -*-
'''
Created on 2013-4-30
@author: herong
模拟多生产者和多消费者
'''
import threading
import Queue
import time
class Producer(threading.Thread):
__taskQueue = Queue.Empty
__taskNum = 1
def __init__(self,name,taskQueue,taskNum=1):
threading.Thread.__init__(self, name=name)
self.__taskQueue = taskQueue
def run(self):
global gTaskTotal,gMaxTaskTotal
taskId = 0
while(True):
#for i in range(self.__taskNum):
try:
gLock.acquire()
gTaskTotal +=1
taskId = gTaskTotal
if taskId >gMaxTaskTotal:
break
finally:
gLock.release()
self.__taskQueue.put(Task("任务-"+str(taskId),"None"))
time.sleep(2)
class Consumer(threading.Thread):
__taskQueue = Queue.Empty
__taskNum = 1
def __init__(self,name,taskQueue,taskNum=1):
threading.Thread.__init__(self, name=name)
self.__taskQueue = taskQueue
self.__taskNum = taskNum
def run(self):
while(True):
#for i in range(self.__taskNum):
task = self.__taskQueue.get()
task.start()
class Task(threading.Thread):
__name = None
__type = None
def __init__(self,name,type):
threading.Thread.__init__(self, name=name)
self.__name = name
self.__type = type
print "【生产者】产生任务:%s,任务类型:%s"%(self.__name,self.__type)
def run(self):
print "【消费者】执行行务%s ......"%(self.__name)
time.sleep(1)
print "【消费者】任务%s执行完毕!"%(self.__name)
if __name__ == '__main__':
gTaskQueue = Queue.Queue(1)
gProducerNum = 10
gConsumerNum = 1
gTaskNum = 2
gTaskTotal = 0
gMaxTaskTotal = 10
gLock = threading.RLock()
for i in range(gConsumerNum):
Consumer("消费者"+str(i+1)+"#", gTaskQueue, gTaskNum).start()
for i in range(gProducerNum):
Producer("生产者"+str(i+1)+"#", gTaskQueue, gTaskNum).start()
输出结果:
【生产者】产生任务:任务-1,任务类型:None
【消费者】执行行务任务-1 ......
【生产者】产生任务:任务-2,任务类型:None
【消费者】执行行务任务-2 ......
【生产者】产生任务:任务-3,任务类型:None
【生产者】产生任务:任务-4,任务类型:None
【消费者】执行行务任务-3 ......
【生产者】产生任务:任务-5,任务类型:None
【消费者】执行行务任务-4 ......
【生产者】产生任务:任务-6,任务类型:None
【消费者】执行行务任务-5 ......
【生产者】产生任务:任务-7,任务类型:None
【消费者】执行行务任务-6 ......
【生产者】产生任务:任务-8,任务类型:None
【消费者】执行行务任务-7 ......
【消费者】执行行务任务-8 ......
【生产者】产生任务:任务-9,任务类型:None
【生产者】产生任务:任务-10,任务类型:None
【消费者】执行行务任务-9 ......
【消费者】执行行务任务-10 ......
【消费者】任务任务-1执行完毕!
【消费者】任务任务-2执行完毕!
【消费者】任务任务-3执行完毕!
【消费者】任务任务-4执行完毕!
【消费者】任务任务-5执行完毕!
【消费者】任务任务-6执行完毕!
【消费者】任务任务-7执行完毕!
【消费者】任务任务-8执行完毕!
【消费者】任务任务-9执行完毕!
【消费者】任务任务-10执行完毕!
【消费者】执行行务任务-1 ......
【生产者】产生任务:任务-2,任务类型:None
【消费者】执行行务任务-2 ......
【生产者】产生任务:任务-3,任务类型:None
【生产者】产生任务:任务-4,任务类型:None
【消费者】执行行务任务-3 ......
【生产者】产生任务:任务-5,任务类型:None
【消费者】执行行务任务-4 ......
【生产者】产生任务:任务-6,任务类型:None
【消费者】执行行务任务-5 ......
【生产者】产生任务:任务-7,任务类型:None
【消费者】执行行务任务-6 ......
【生产者】产生任务:任务-8,任务类型:None
【消费者】执行行务任务-7 ......
【消费者】执行行务任务-8 ......
【生产者】产生任务:任务-9,任务类型:None
【生产者】产生任务:任务-10,任务类型:None
【消费者】执行行务任务-9 ......
【消费者】执行行务任务-10 ......
【消费者】任务任务-1执行完毕!
【消费者】任务任务-2执行完毕!
【消费者】任务任务-3执行完毕!
【消费者】任务任务-4执行完毕!
【消费者】任务任务-5执行完毕!
【消费者】任务任务-6执行完毕!
【消费者】任务任务-7执行完毕!
【消费者】任务任务-8执行完毕!
【消费者】任务任务-9执行完毕!
【消费者】任务任务-10执行完毕!