Python同步隊(duì)列正確應(yīng)用方式解析
我們今天將會(huì)通過Python同步隊(duì)列的相關(guān)介紹,來詳細(xì)分析一下這一編程語言中的多線程應(yīng)用。希望對(duì)此又需要的朋友們可以通過本文介紹的內(nèi)容充分的掌握這一應(yīng)用技巧,以方便將來的實(shí)際應(yīng)用。#t#
我們經(jīng)常會(huì)采用生產(chǎn)者/消費(fèi)者關(guān)系的兩個(gè)線程來處理一個(gè)共享緩沖區(qū)的數(shù)據(jù)。例如一個(gè)生產(chǎn)者線程接受用戶數(shù)據(jù)放入一個(gè)共享緩沖區(qū)里,等待一個(gè)消費(fèi)者線程對(duì)數(shù)據(jù) 取出處理。但是如果緩沖區(qū)的太小而生產(chǎn)者和消費(fèi)者兩個(gè)異步線程的速度不同時(shí),容易出現(xiàn)一個(gè)線程等待另一個(gè)情況。為了盡可能的縮短共享資源并以相同速度工作 的各線程的等待時(shí)間,我們可以使用一個(gè)“隊(duì)列”來提供額外的緩沖區(qū)。
創(chuàng)建一個(gè)“隊(duì)列”對(duì)象
- import Queue
 - myqueue = Queue.Queue(maxsize = 10)Queue.Queue
 
類即是一個(gè)隊(duì)列的同步實(shí)現(xiàn)。隊(duì)列長(zhǎng)度可為無限或者有限??赏ㄟ^Queue的構(gòu)造函數(shù)的可選參數(shù)maxsize來設(shè)定隊(duì)列長(zhǎng)度。如果maxsize小于1就表示隊(duì)列長(zhǎng)度無限。
將一個(gè)值放入隊(duì)列中
- myqueue.put(10)
 
調(diào)用隊(duì)列對(duì)象的put()方法在隊(duì)尾插入一個(gè)項(xiàng)目。put()有兩個(gè)參數(shù),第一個(gè)item為必需的,為插入項(xiàng)目的值;第二個(gè)block為可選參數(shù),默認(rèn)為1。如果隊(duì)列當(dāng)前為空且block為1,put()方法就使調(diào)用線程暫停,直到空出一個(gè)數(shù)據(jù)單元。如果block為0,put方法將引發(fā)Full異常。
將一個(gè)值從隊(duì)列中取出
- myqueue.get()
 
調(diào)用隊(duì)列對(duì)象的get()方法從隊(duì)頭刪除并返回一個(gè)項(xiàng)目??蛇x參數(shù)為block,默認(rèn)為1。如果隊(duì)列為空且block為1,get()就使調(diào)用線程暫停,直至有項(xiàng)目可用。如果block為0,隊(duì)列將引發(fā)Empty異常。
我們用一個(gè)Python同步隊(duì)列例子來展示如何使用Queue# queue_example.py
- from Queue import Queue
 - import threading
 - import random
 - import time
 - # Producer thread
 - class Producer(threading.Thread):
 - def __init__(self, threadname, queue):
 - threading.Thread.__init__(self, name = threadname)
 - self.sharedata = queue
 - def run(self):
 - for i in range(20):
 - print self.getName(),’adding’,i,’to queue’
 - self.sharedata.put(i)
 - time.sleep(random.randrange(10)/10.0)
 - print self.getName(),’Finished’
 - # Consumer thread
 - class Consumer(threading.Thread):
 - def __init__(self, threadname, queue):
 - threading.Thread.__init__(self, name = threadname)
 - self.sharedata = queue
 - def run(self):
 - for i in range(20):
 - print self.getName(),’got a value:’,self.sharedata.get()
 - time.sleep(random.randrange(10)/10.0)
 - print self.getName(),’Finished’
 - # Main thread
 - def main():
 - queue = Queue()
 - producer = Producer(’Producer’, queue)
 - consumer = Consumer(’Consumer’, queue)
 - print ‘Starting threads …’
 - producer.start()
 - consumer.start()
 - producer.join()
 - consumer.join()
 - print ‘All threads have terminated.’
 - if __name__ == ‘__main__’:
 - main()
 
Python同步隊(duì)列示例代碼中實(shí)現(xiàn)了兩個(gè)類:生產(chǎn)者類Producer和消費(fèi)者類Consumer。前者在一個(gè)隨機(jī)的時(shí)間內(nèi)放入一個(gè)值到隊(duì)列queue中然后顯示出來,后者在一定隨機(jī)的時(shí)間內(nèi)從隊(duì)列queue中取出一個(gè)值并顯示出來。















 
 
 
 
 
 
 