生产者--消费者问题和Queue模块

myThread.py

import threading
from time import sleep,ctime

class MyThread(threading.Thread):
    def __init__(self,func,args,name=''):
        threading.Thread.__init__(self)
        self.name=name
        self.func=func
        self.args=args

    def getResult(self):
        return self.res
    def run(self):
        print 'starting', self.name, 'at:', \
              ctime()
        self.res=apply(self.func,self.args)
        print self.name,'finished at:', \
              ctime()

prodcons.py

from random import randint
from time import sleep
from Queue import Queue
from myThread import MyThread

def writeQ(queue):
    print 'producing object for Q...'
    queue.put('xxx',1)
    print "size now", queue.qsize()

def readQ(queue):
    val=queue.get(1)
    print 'consumed object from Q...size now', \
          queue.qsize()

def writer(queue,loops):
    for i in range(loops):
        writeQ(queue)
        sleep(randint(1,3))

def reader(queue,loops):
    for i in range(loops):
        readQ(queue)
        sleep(randint(2,5))

funcs=[writer,reader]
nfuncs=range(len(funcs))

def main():
    nloops=randint(2,5)
    q=Queue(32)

    threads=[]
    for i in nfuncs:
        t=MyThread(funcs[i],(q,nloops),funcs[i].__name__)
        threads.append(t)

    for i in nfuncs:
        threads[i].start()

    for i in nfuncs:
        threads[i].join()

    print 'all Done'


if __name__=='__main__':
    main()

运行结果:

>>> starting writerstarting  at:reader  Tue Dec 18 16:10:44 2012at: Tue Dec 18 16:10:44 2012

producing object for Q...
size nowconsumed object from Q...size now 0 
0
producing object for Q...
size now 1
producing object for Q...
size now 2
producing object for Q...
size now 3
consumed object from Q...size now 2
producing object for Q...
size now 3
writer finished at: Tue Dec 18 16:10:53 2012
consumed object from Q...size now 2
consumed object from Q...size now 1
consumed object from Q...size now 0
reader finished at: Tue Dec 18 16:11:08 2012
all Done



你可能感兴趣的:(生产者--消费者问题和Queue模块)