python 多线程笔记-模拟生产者与消费者

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执行完毕!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值