欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Python中的四種隊列

 更新時間:2018年05月21日 14:04:51   作者:simpleapples  
隊列是一種只允許在一端進行插入操作,而在另一端進行刪除操作的線性表。這篇文章主要介紹了Python中的四種隊列,需要的朋友可以參考下

隊列是一種只允許在一端進行插入操作,而在另一端進行刪除操作的線性表。

在Python文檔中搜索隊列(queue)會發(fā)現,Python標準庫中包含了四種隊列,分別是queue.Queue / asyncio.Queue / multiprocessing.Queue / collections.deque。

collections.deque

deque是雙端隊列(double-ended queue)的縮寫,由于兩端都能編輯,deque既可以用來實現棧(stack)也可以用來實現隊列(queue)。

deque支持豐富的操作方法,主要方法如圖:

 

相比于list實現的隊列,deque實現擁有更低的時間和空間復雜度。list實現在出隊(pop)和插入(insert)時的空間復雜度大約為O(n),deque在出隊(pop)和入隊(append)時的時間復雜度是O(1)。

deque也支持in操作符,可以使用如下寫法:

q = collections.deque([1, 2, 3, 4])
print(5 in q) # False
print(1 in q) # True

deque還封裝了順逆時針的旋轉的方法:rotate。

# 順時針
q = collections.deque([1, 2, 3, 4])
q.rotate(1)
print(q) # [4, 1, 2, 3]
q.rotate(1)
print(q) # [3, 4, 1, 2]
# 逆時針
q = collections.deque([1, 2, 3, 4])
q.rotate(-1)
print(q) # [2, 3, 4, 1]
q.rotate(-1)
print(q) # [3, 4, 1, 2]

線程安全方面,collections.deque中的append()、pop()等方法都是原子操作,所以是GIL保護下的線程安全方法。

static PyObject *
deque_append(dequeobject *deque, PyObject *item) { 
 Py_INCREF(item);
 if (deque_append_internal(deque, item, deque->maxlen) < 0) 
 return NULL;
 Py_RETURN_NONE;
}

通過dis方法可以看到,append是原子操作(一行字節(jié)碼)。

 

綜上,collections.deque是一個可以方便實現隊列的數據結構,具有線程安全的特性,并且有很高的性能。

queue.Queue & asyncio.Queue

queue.Queue和asyncio.Queue都是支持多生產者、多消費者的隊列,基于collections.deque,他們都提供了Queue(FIFO隊列)、PriorityQueue(優(yōu)先級隊列)、LifoQueue(LIFO隊列),接口方面也相同。

區(qū)別在于queue.Queue適用于多線程的場景,asyncio.Queue適用于協程場景下的通信,由于asyncio的加成,queue.Queue下的阻塞接口在asyncio.Queue中則是以返回協程對象的方式執(zhí)行,具體差異如下表:

multiprocessing.Queue

multiprocessing提供了三種隊列,分別是Queue、SimpleQueue、JoinableQueue。

 

multiprocessing.Queue既是線程安全也是進程安全的,相當于queue.Queue的多進程克隆版。和threading.Queue很像,multiprocessing.Queue支持put和get操作,底層結構是multiprocessing.Pipe。

multiprocessing.Queue底層是基于Pipe構建的,但是數據傳遞時并不是直接寫入Pipe,而是寫入進程本地buffer,通過一個feeder線程寫入底層Pipe,這樣做是為了實現超時控制和非阻塞put/get,所以Queue提供了join_thread、cancel_join_thread、close函數來控制feeder的行為,close函數用來關閉feeder線程、join_thread用來join feeder線程,cancel_join_thread用來在控制在進程退出時,不自動join feeder線程,使用cancel_join_thread有可能導致部分數據沒有被feeder寫入Pipe而導致的數據丟失。

和threading.Queue不同的是,multiprocessing.Queue默認不支持join()和task_done操作,這兩個支持需要使用mp.JoinableQueue對象。

SimpleQueue是一個簡化的隊列,去掉了Queue中的buffer,沒有了使用Queue可能出現的問題,但是put和get方法都是阻塞的并且沒有超時控制。

總結

通過對比可以發(fā)現,上述四種結構都實現了隊列,但是用處卻各有偏重,collections.deque在數據結構層面實現了隊列,但是并沒有應用場景方面的支持,可以看做是一個基礎的數據結構。queue模塊實現了面向多生產線程、多消費線程的隊列,asyncio.queue模塊則實現了面向多生產協程、多消費協程的隊列,而multiprocessing.queue模塊實現了面向多成產進程、多消費進程的隊列。

以上所述是小編給大家介紹的Python中的四種隊列,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

相關文章

  • python和JavaScript通信

    python和JavaScript通信

    這篇文章主要介紹了python和JavaScript通信,js和python是兩種語言,js處理網頁數據,python可作為服務端開發(fā),兩者通過websocket進行通信,下文具體操作內容需要的小伙伴可以參考一下
    2022-04-04
  • python實現多層感知器

    python實現多層感知器

    這篇文章主要為大家詳細介紹了python實現多層感知器的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Python調整PDF頁面尺寸大小的兩種方法

    Python調整PDF頁面尺寸大小的兩種方法

    利用Python語言的高效性和靈活性,再結合Spire.PDF for Python 庫的強大功能,我們可以通過Python代碼輕松實現對PDF頁面的批量調整,在這篇文章中,我們將介紹兩種調整PDF頁面大小的方法,感興趣的朋友可以參考下
    2024-05-05
  • Python3開發(fā)實例之非關系型圖數據庫Neo4j安裝方法及Python3連接操作Neo4j方法實例

    Python3開發(fā)實例之非關系型圖數據庫Neo4j安裝方法及Python3連接操作Neo4j方法實例

    這篇文章主要介紹了Python3開發(fā)實例之非關系型圖數據庫Neo4j安裝方法及Python3連接操作Neo4j方法實例,需要的朋友可以參考下
    2020-03-03
  • python實現簡單爬蟲功能的示例

    python實現簡單爬蟲功能的示例

    本文主要是介紹python實現簡單爬蟲功能的示例,主要實現了把我們想要的圖片爬蟲到本地的一個示例,有需要的朋友可以了解一下。
    2016-10-10
  • pygame游戲之旅 如何制作游戲障礙

    pygame游戲之旅 如何制作游戲障礙

    這篇文章主要為大家詳細介紹了pygame游戲之旅的第6篇,教大家如何制作游戲障礙,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • Python?面向切面編程?AOP?及裝飾器

    Python?面向切面編程?AOP?及裝飾器

    這篇文章主要介紹了Python?面向切面編程?AOP?及裝飾器,AOP,就是面向切面編程,簡單的說,就是動態(tài)地將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面的編程,更多相關資需要的小伙伴可以參考下面文章內容
    2022-05-05
  • Python日志syslog使用原理詳解

    Python日志syslog使用原理詳解

    這篇文章主要介紹了Python日志syslog使用原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • 關于Python dict存中文字符dumps()的問題

    關于Python dict存中文字符dumps()的問題

    這篇文章主要介紹了關于Python dict存中文字符dumps()的問題,本文給大家分享問題及解決方案,給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-10-10
  • python使用Matplotlib畫條形圖

    python使用Matplotlib畫條形圖

    這篇文章主要為大家詳細介紹了python使用Matplotlib畫條形圖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09

最新評論