Queue模块可以用来进行线程间通信,让各个线程之间共享数据。现在,我们创建一个队列,让生产者(线程)把新生产的货物放进去供消费者(线程)使用,为了达到这个目的,我们要用到Queue模块的以下属性:
通用队列模块属性
Function/Method | Description |
---|---|
Queue Module Function | |
queue(size) | Creates a Queue object of givensize |
Queue Object Methods | |
qsize() | Returns queue size (approximate, since queue may be getting updated by other threads) |
empty() | Returns TRue if queue empty,False otherwise |
full() | Returns true if queue full,False otherwise |
put(item, block=0) | Puts item in queue, if block given (not 0), block until room is available |
get(block=0) | Gets item from queue, if block given (not 0), block until an item is available |
#! /usr/bin/env python
#coding=utf-8
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: %d"%queue.qsize())
def readQ(queue):
val = queue.get(1)
print("consumed object from Q... size now : %d"%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,10)
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("...main completed")
if __name__ == "__main__":
main()
>>>
starting writer at: Sat Jul 26 00:33:08 2014
producing object for Q...
size now: 1
starting reader at: Sat Jul 26 00:33:08 2014
consumed object from Q... size now : 0
producing object for Q...
size now: 1
consumed object from Q... size now : 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 done at: Sat Jul 26 00:33:19 2014
consumed object from Q... size now : 2
consumed object from Q... size now : 1
consumed object from Q... size now : 0
reader done at: Sat Jul 26 00:33:33 2014
...main completed
#! /usr/bin/env python
#coding=utf-8
import threading
from time import ctime
class MyThread(threading.Thread):
def __init__(self,func,args,name=''):
threading.Thread.__init__(self)
self.func = func
self.args = args
self.name = name
def getResult(self):
return self.res
def run(self):
print("starting %s at: %s"%(self.name,ctime()))
self.res = apply(self.func,self.args)
print("%s done at: %s"%(self.name,ctime()))