1. 程式人生 > >Python之queue模塊

Python之queue模塊

阻塞 是否 內容 內部 構造 get 操作 執行 無限

一、queue——同步的隊列類

  queue模塊實現了多生產者,多消費者的隊列。當 要求信息必須在多線程間安全交換,這個模塊在 線程編程時非常有用 。Queue模塊實現了所有要求的鎖機制。 說了半天就是Queue模塊主要是多線程,保證線程安全使用的。

  這個類實現了三種類型的queue,區別僅僅在於進去和取出的位置。在一個FIFO(First In,First Out)隊列中,先加先取。在一個LIFO(Last In First Out)的隊列中,最後加的先出來(操作起來跟stack一樣)。priority隊列,有序保存,優先級最低的先出來。

  內部實現是在搶占式線程加上臨時鎖。但是沒有涉及如何去處理線程的重入。

二、queue模塊的內容

  1. class queue.Queue(maxsize = 0)

    構造一個FIFO隊列,maxsize可以限制隊列的大小。如果隊列的大小達到了隊列的上限,就會加鎖,加入就會阻塞,直到隊列的內容被消費掉。maxsize的值小於等於0,那麽隊列的尺寸就是無限制的

  2. class queue.LifoQueue(maxsize = 0)

    構造一個Lifo隊列

  3. class PriorityQueue(maxsize = 0)

    優先級最低的先出去,優先級最低的一般使用sorted(list(entries))[0])。典型加入的元素是一個元祖(優先級, 數據)

  

  4. queue.empty異常

    只有非阻塞的時候,隊列為空,取數據才會報異常

  5. queue.Full異常

    只有非阻塞的時候,隊列滿了,繼續放數據才會出現異常

三、隊列對象的方法:

  Queue.qsize() :返回queue的近似值。註意:qsize>0 不保證(get)取元素不阻塞。qsize< maxsize不保證(put)存元素不會阻塞

  Queue.empty():判斷隊列是否為空。和上面一樣註意

  Queue.full():判斷是否滿了。和上面一樣註意

  Queue.put(item, block=True

, timeout=None): 往隊列裏放數據。如果滿了的話,blocking = False 直接報 Full異常。如果blocking = True,就是等一會,timeout必須為 0 或正數。None為一直等下去,0為不等,正數n為等待n秒還不能存入,報Full異常。

  Queue.put_nowait(item):往隊列裏存放元素,不等待

  

  

  Queue.get(item, block=True, timeout=None): 從隊列裏取數據。如果為空的話,blocking = False 直接報 empty異常。如果blocking = True,就是等一會,timeout必須為 0 或正數。None為一直等下去,0為不等,正數n為等待n秒還不能讀取,報empty異常。

  Queue.get_nowait(item):從隊列裏取元素,不等待

  兩個方法跟蹤入隊的任務是否被消費者daemon進程完全消費

  Queue.task_done()

    表示一個正式的入隊任務的完成。被隊列消費進程使用。每個get()方法會拿到一個任務,其隨後調用task_done()表示這個隊列,這個隊列的線程的任務完成。就是發送消息,告訴完成啦!

    如果當前的join()當前處於阻塞狀態,當前的所有元素執行後都會重啟(意味著收到加入queue的每一個對象的task_done()調用的信息)

    如果調用的次數操作放入隊列的items的個數多的話,會觸發ValueError異常

  Queue.join()

    一直阻塞直到隊列中的所有元素都被取出和執行

    未完成的個數,只要有元素添加到queue中就會增加。未完成的個數,只要消費者線程調用task_done()表明其被取走,其調用結束。當未完成任務的計數等於0,join()就會不阻塞

Python之queue模塊