【Python學習篇】線程安全隊列Queue

隊列是線程間最常用的交換數據的形式,Queue模塊實現了線程安全的隊列,尤其適合多線程編程。Queue模塊實現了三種類型隊列:
❑Queue Queue:一個先進先出(FIFO)的隊列,最先加入隊列的元素最先取出;
❑LifoQueue LifoQueue:一個後進先出(LIFO)的隊列,最後加入隊列的元素最先取出;❑PriorityQueue PriorityQueue:優先級隊列,隊列中的元素根據優先級排序。
在這三種不同的隊列中,Queue是最簡單也是最常用的隊列。如下所示:

    import Queue
    q = Queue.Queue()
    for i in range(3):
        q.put(i)
    while not q.empty():
        print(q.get())

Queue本身是一個先進先出的隊列,我們使用put方法向隊列中添加元素時,會將元素添加到隊列的尾部。使用get方法從Queue中獲取元素時,會從隊列的頭部取出元素。這裏的例子僅僅演示了單線程的情況下,Queue最大的優勢在於它是線程安全的,我們完全可以將Queue用於多線程環境中,而不用處理併發訪問的情況。
常用方法:
❑empty:判斷隊列是否爲空;
❑full:判斷隊列是否已滿;
❑put:向隊列中添加元素,可以通過可選的block參數和timeout參數控制put是否爲阻塞等待。如果是阻塞等待,並且timeout是一個正數,那麼,put方法將會在超時以後引發Queue.Full異常;❑put_nowait:非阻塞地向隊列添加元素;
❑get:從隊列中取出元素,可以通過block參數控制是否阻塞等待,通過timeout控制阻塞等待的時間。如果超時也沒有得到元素,拋出Queue.Empty異常;
❑get_nowait:非阻塞地從隊列中取出元素;❑task_done:與join一起工作,指示先前取出的元素已經完成處理;
❑join:阻塞等待,直到所有消費者對每一個元素都調用了task_done。

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