Python中的Queue對象提供了對線程同步的支持,使用queue對象可以實現多生產者和多消費者形成的先進先出的隊列。
每個生產者將數據放入隊列,而每個消費者依次從隊列中取出數據。
# coding:utf-8 import threading,time,Queue class Producer(threading.Thread): def __init__(self,threadname): threading.Thread.__init__(self,name=threadname) def run(self): global queue queue.put(self.getName()) print self.getName(),'put',self.getName(),'to queue' class Consumer(threading.Thread): def __init__(self,threadname): threading.Thread.__init__(self,name=threadname) def run(self,threadname): global queue print self.getName(),'get',queue.get(),'from queue' #生成隊列對象 queue = Queue.Queue() #生產者對象列表 plist = [] #消費者對象列表 clist = [] for i in range(10): p = Producer('Producer' + str(i)) plist.append(p) for i in range(10): c = Consumer('Consumer' + str(i)) #運行生產者 for i in plist: i.start() i.join() #運行消費者 for i in clist: i.start() i.join()
運行結果:
Producer0 put Producer0 to queue Producer1 put Producer1 to queue Producer2 put Producer2 to queue Producer3 put Producer3 to queue Producer4 put Producer4 to queue Producer5 put Producer5 to queue Producer6 put Producer6 to queue Producer7 put Producer7 to queue Producer8 put Producer8 to queue Producer9 put Producer9 to queue Process finished with exit code 0
另外,可以使用Stackless Python實現,它只是一個Python的修改版本,對多線程編程有更好的支持。如果對多線程應用有較高的要求,則可以考慮使用Stackless Python來完成。
Stackless官方網站:https://bitbucket.org/stackless-dev/stackless/wiki/Home
同樣實現生產者消費者案例代碼如下:
import stackless,Queue def Producer(i): global queue queue.put(i) print "Producer",i,'add',i def Consumer(): global queue i = queue.get() print 'Consumer',i, 'get',i queue = Queue.Queue() for i in range(10): stackless.tasklet(Producer)(i) for i in range(10): stackless.tasklet(Consumer)() stackless.run()
執行結果:
Producer 0 add 0 Producer 1 add 1 Producer 2 add 2 Producer 3 add 3 Producer 4 add 4 Producer 5 add 5 Producer 6 add 6 Producer 7 add 7 Producer 8 add 8 Producer 9 add 9 Consumer 0 get 0 Consumer 1 get 1 Consumer 2 get 2 Consumer 3 get 3 Consumer 4 get 4 Consumer 5 get 5 Consumer 6 get 6 Consumer 7 get 7 Consumer 8 get 8 Consumer 9 get 9 Process finished with exit code 0
Stackless Python 提供了對微線程的支持,微線程是輕量級的線程,與前面的Thread相比,佔用資源更少。