<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 431,  comments - 344,  trackbacks - 0
    我們經(jīng)常會采用生產(chǎn)者/消費者關(guān)系的兩個線程來處理一個共享緩沖區(qū)的數(shù)據(jù)。例如一個生產(chǎn)者線程接受用戶數(shù)據(jù)放入一個共享緩沖區(qū)里,等待一個消費者線程對數(shù)據(jù)取出處理。但是如果緩沖區(qū)的太小而生產(chǎn)者和消費者兩個異步線程的速度不同時,容易出現(xiàn)一個線程等待另一個情況。為了盡可能的縮短共享資源并以相同速度工作的各線程的等待時間,我們可以使用一個“隊列”來提供額外的緩沖區(qū)。

        創(chuàng)建一個“隊列”對象

        import Queue
        myqueue = Queue.Queue(maxsize = 10)

        Queue.Queue類即是一個隊列的同步實現(xiàn)。隊列長度可為無限或者有限。可通過Queue的構(gòu)造函數(shù)的可選參數(shù)maxsize來設(shè)定隊列長度。如果maxsize小于1就表示隊列長度無限。

        將一個值放入隊列中

        myqueue.put(10)

        調(diào)用隊列對象的put()方法在隊尾插入一個項目。put()有兩個參數(shù),第一個item為必需的,為插入項目的值;第二個block為可選參數(shù),默認(rèn)為1。如果隊列當(dāng)前為空且block1put()方法就使調(diào)用線程暫停,直到空出一個數(shù)據(jù)單元。如果block0put方法將引發(fā)Full異常。

        將一個值從隊列中取出

        myqueue.get()

        調(diào)用隊列對象的get()方法從隊頭刪除并返回一個項目。可選參數(shù)為block,默認(rèn)為1。如果隊列為空且block1get()就使調(diào)用線程暫停,直至有項目可用。如果block為0,隊列將引發(fā)Empty異常。

        我們用一個例子來展示如何使用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()

        示例代碼中實現(xiàn)了兩個類:生產(chǎn)者類Producer和消費者類Consumer。前者在一個隨機(jī)的時間內(nèi)放入一個值到隊列queue中然后顯示出來,后者在一定隨機(jī)的時間內(nèi)從隊列queue中取出一個值并顯示出來。

    posted on 2007-09-25 16:02 周銳 閱讀(513) 評論(0)  編輯  收藏 所屬分類: Python
    主站蜘蛛池模板: 国产成人亚洲综合在线| 亚洲а∨天堂久久精品9966| 国产久爱免费精品视频| 国产又黄又爽又猛的免费视频播放| 亚洲色www永久网站| 成年人网站在线免费观看| 亚洲制服丝袜第一页| 四虎成人免费网站在线| 亚洲男人的天堂一区二区| 亚洲色大成WWW亚洲女子| 午夜免费福利网站| 亚洲gay片在线gv网站| 国产高清免费的视频| 美女一级毛片免费观看| 精品国产亚洲男女在线线电影 | 另类免费视频一区二区在线观看| 国产午夜亚洲精品理论片不卡| 中文在线日本免费永久18近| 亚洲国产综合精品中文第一区| 亚洲一级毛片免费观看| 国产成人亚洲合集青青草原精品| 成年美女黄网站18禁免费| 无码一区二区三区亚洲人妻| 亚洲人成网站在线观看青青| 水蜜桃视频在线观看免费播放高清| 亚洲视频在线一区| 国产一精品一AV一免费孕妇| 精品一区二区三区免费毛片| 亚洲一区二区三区香蕉| 久久午夜夜伦鲁鲁片免费无码影视| 亚洲人xxx日本人18| 亚洲美女在线国产| 香港a毛片免费观看| 亚洲丰满熟女一区二区哦| 国产精品亚洲αv天堂无码| 最近中文字幕国语免费完整| 亚洲欧美日韩自偷自拍| 亚洲性猛交XXXX| 我要看WWW免费看插插视频| 国产一二三四区乱码免费| 亚洲a∨无码男人的天堂|