python 線程同步:生產/消費者模式

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相比,佔用資源更少。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章