最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Python中的四種隊列

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

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

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

collections.deque

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

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

 

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

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

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

deque還封裝了順逆時針的旋轉(zhuǎn)的方法: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保護(hù)下的線程安全方法。

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是一個可以方便實現(xiàn)隊列的數(shù)據(jù)結(jié)構(gòu),具有線程安全的特性,并且有很高的性能。

queue.Queue & asyncio.Queue

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

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

multiprocessing.Queue

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

 

multiprocessing.Queue既是線程安全也是進(jìn)程安全的,相當(dāng)于queue.Queue的多進(jìn)程克隆版。和threading.Queue很像,multiprocessing.Queue支持put和get操作,底層結(jié)構(gòu)是multiprocessing.Pipe。

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

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

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

總結(jié)

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

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

相關(guān)文章

  • 詳解Python當(dāng)中的字符串和編碼

    詳解Python當(dāng)中的字符串和編碼

    這篇文章主要介紹了詳解Python當(dāng)中的字符串和編碼,代碼基于Python2.x版本,文中所述皆是Python學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-04-04
  • Python實現(xiàn)分?jǐn)?shù)序列求和

    Python實現(xiàn)分?jǐn)?shù)序列求和

    今天小編就為大家分享一篇Python實現(xiàn)分?jǐn)?shù)序列求和,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python全局鎖中如何合理運用多線程(多進(jìn)程)

    Python全局鎖中如何合理運用多線程(多進(jìn)程)

    這篇文章主要介紹了Python全局鎖中如何合理運用多線程(多進(jìn)程),需要的朋友可以參考下
    2019-11-11
  • python如何實現(xiàn)控制電腦音量

    python如何實現(xiàn)控制電腦音量

    這篇文章主要介紹了python如何實現(xiàn)控制電腦音量問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Python中request庫的各種用法詳細(xì)解析

    Python中request庫的各種用法詳細(xì)解析

    本文詳細(xì)介紹了Python的requests庫的安裝與使用,包括HTTP請求方法、請求頭、請求體的基本概念,以及發(fā)送GET和POST請求的基本用法,同時,探討了會話對象、處理重定向、超時設(shè)置、代理支持等高級功能,幫助讀者更高效地處理復(fù)雜的HTTP請求場景,需要的朋友可以參考下
    2024-10-10
  • python cv2讀取rtsp實時碼流按時生成連續(xù)視頻文件方式

    python cv2讀取rtsp實時碼流按時生成連續(xù)視頻文件方式

    今天小編就為大家分享一篇python cv2讀取rtsp實時碼流按時生成連續(xù)視頻文件方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python圖像處理庫PIL的ImageGrab模塊介紹詳解

    Python圖像處理庫PIL的ImageGrab模塊介紹詳解

    這篇文章主要介紹了Python圖像處理庫PIL的ImageGrab模塊介紹詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • django2用iframe標(biāo)簽完成網(wǎng)頁內(nèi)嵌播放b站視頻功能

    django2用iframe標(biāo)簽完成網(wǎng)頁內(nèi)嵌播放b站視頻功能

    這篇文章主要介紹了django2 用iframe標(biāo)簽完成 網(wǎng)頁內(nèi)嵌播放b站視頻功能,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • 深入解讀Python解析XML的幾種方式

    深入解讀Python解析XML的幾種方式

    這篇文章主要為大家詳細(xì)介紹了深入解讀Python解析XML的幾種方式,以ElementTree模塊為例,演示具體使用方法和場景,感興趣的小伙伴們可以參考一下
    2016-02-02
  • python爬蟲_實現(xiàn)校園網(wǎng)自動重連腳本的教程

    python爬蟲_實現(xiàn)校園網(wǎng)自動重連腳本的教程

    下面小編就為大家分享一篇python爬蟲_實現(xiàn)校園網(wǎng)自動重連腳本的教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04

最新評論

赫章县| 宁晋县| 和田县| 同仁县| 自治县| 聊城市| 越西县| 丘北县| 印江| 四会市| 康马县| 遂昌县| 宜阳县| 孝昌县| 娄底市| 化州市| 永城市| 长岭县| 亚东县| 渝北区| 镇江市| 榆林市| 咸宁市| 怀柔区| 安塞县| 祁门县| 台南县| 聂拉木县| 盐津县| 万载县| 祁连县| 泊头市| 厦门市| 叙永县| 宁武县| 乌审旗| 南江县| 大连市| 东阳市| 余干县| 衡南县|