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

              創建一個“隊列”對象

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

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

              將一個值放入隊列中

              myqueue.put(10)

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

              將一個值從隊列中取出

              myqueue.get()

              調用隊列對象的get()方法從隊頭刪除并返回一個項目。可選參數為block,默認為1。如果隊列為空且block1get()就使調用線程暫停,直至有項目可用。如果block為0,隊列將引發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()

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

          posted on 2007-09-25 16:02 周銳 閱讀(510) 評論(0)  編輯  收藏 所屬分類: Python
          主站蜘蛛池模板: 察隅县| 宁德市| 梓潼县| 和田市| 张掖市| 中山市| 包头市| 横山县| 革吉县| 江阴市| 彭泽县| 从化市| 西和县| 廊坊市| 阳高县| 武胜县| 丘北县| 简阳市| 邵阳市| 横山县| 馆陶县| 楚雄市| 黎川县| 齐齐哈尔市| 慈利县| 淄博市| 沁源县| 昌平区| 独山县| 明溪县| 合水县| 眉山市| 涡阳县| 图片| 舒城县| 大渡口区| 五台县| 龙井市| 庆阳市| 枞阳县| 梅河口市|