在线不卡日本ⅴ一区v二区_精品一区二区中文字幕_天堂v在线视频_亚洲五月天婷婷中文网站

  • <menu id="lky3g"></menu>
  • <style id="lky3g"></style>
    <pre id="lky3g"><tt id="lky3g"></tt></pre>

    Python Queue 入門

    Queue 簡介

    Queue 叫隊(duì)列,是數(shù)據(jù)結(jié)構(gòu)中的一種,基本上所有成熟的編程語言都內(nèi)置了對 Queue 的支持。

    Python 中的 Queue 模塊實(shí)現(xiàn)了多生產(chǎn)者和多消費(fèi)者模型,當(dāng)需要在多線程編程中非常實(shí)用。而且該模塊中的 Queue 類實(shí)現(xiàn)了鎖原語,不需要再考慮多線程安全問題。

    該模塊內(nèi)置了三種類型的 Queue,分別是 class queue.Queue(maxsize=0),class queue.LifoQueue(maxsize=0) 和 class queue.PriorityQueue(maxsize=0)。它們?nèi)齻€(gè)的區(qū)別僅僅是取出時(shí)的順序不一致而已。

    Queue 是一個(gè) FIFO 隊(duì)列,任務(wù)按照添加的順序被取出。

    LifoQueue 是一個(gè) LIFO 隊(duì)列,類似堆棧,后添加的任務(wù)先被取出。

    PriorityQueue 是一個(gè)優(yōu)先級隊(duì)列,隊(duì)列里面的任務(wù)按照優(yōu)先級排序,優(yōu)先級高的先被取出。

    Queue 常用操作

    類和異常

    class queue.Queue(maxsize=0)class queue.LifoQueue(maxsize=0)class queue.PriorityQueue(maxsize=0)

    如你所見,就是上面所說的三種不同類型的內(nèi)置隊(duì)列,其中 maxsize 是個(gè)整數(shù),用于設(shè)置可以放入隊(duì)列中的任務(wù)數(shù)的上限。當(dāng)達(dá)到這個(gè)大小的時(shí)候,插入操作將阻塞至隊(duì)列中的任務(wù)被消費(fèi)掉。如果 maxsize 小于等于零,則隊(duì)列尺寸為無限大。

    exception queue.Empty# 對空的 Queue 對象調(diào)用非阻塞的 get() (or get_nowait()) 時(shí),會(huì)引發(fā)該異常。exception queue.Full# 對滿的 Queue 對象調(diào)用非阻塞的 put() (or put_nowait()) 時(shí),會(huì)引發(fā)該異常。

    常用操作

    1、添加任務(wù)

    向隊(duì)列中添加任務(wù),直接調(diào)用 put() 函數(shù)即可

    >>> import queue>>> q = queue.Queue(maxsize=1)>>> q.put(100)

    put() 函數(shù)完整的函數(shù)簽名如下 Queue.put(item, block=True, timeout=None),如你所見,該函數(shù)有兩個(gè)可選參數(shù)。

    默認(rèn)情況下,在隊(duì)列滿時(shí),該函數(shù)會(huì)一直阻塞,直到隊(duì)列中有空余的位置可以添加任務(wù)為止。如果 timeout 是正數(shù),則最多阻塞 timeout 秒,如果這段時(shí)間內(nèi)還沒有空余的位置出來,則會(huì)引發(fā) Full 異常。

    >>> import queue>>> q = queue.Queue(maxsize=1)>>> q.put(100)>>> q.put(100,True,2)Traceback (most recent call last): File “”, line 1, in File “E:Python37-32libqueue.py”, line 147, in put raise Fullqueue.Full # 創(chuàng)建一個(gè)容量為 1 的隊(duì)列,2 秒內(nèi)沒有位置添加任務(wù)則引發(fā) Full 異常>>> q.put(100) # 該方法會(huì)一直阻塞

    當(dāng) block 為 false 時(shí),timeout 參數(shù)將失效。同時(shí)如果隊(duì)列中沒有空余的位置可添加任務(wù)則會(huì)引發(fā) Full 異常,否則會(huì)直接把任務(wù)放入隊(duì)列并返回,不會(huì)阻塞。

    >>> import queue>>> q = queue.Queue(maxsize=1)>>> q.put(100)>>> q.put(100,False,2)Traceback (most recent call last): File “”, line 1, in File “E:Python37-32libqueue.py”, line 136, in put raise Fullqueue.Full# 創(chuàng)建一個(gè)容量為 1 的隊(duì)列,在第二次放入任務(wù)時(shí)指定為非阻塞模式,則會(huì)立刻引發(fā) Full 異常

    另外,還可以通過 Queue.put_nowait(item) 來添加任務(wù),相當(dāng)于 Queue.put(item, False),不再贅述。同樣,在隊(duì)列滿時(shí),該操作會(huì)引發(fā) Full 異常。

    2、獲取任務(wù)

    從隊(duì)列中獲取任務(wù),直接調(diào)用 get() 函數(shù)即可。

    >>> import queue>>> q = queue.Queue()>>> q.put(100)>>> q.get()100

    與 put() 函數(shù)一樣,get() 函數(shù)也有兩個(gè)可選參數(shù),完整簽名如下 Queue.get(block=True, timeout=None)。

    默認(rèn)情況下,當(dāng)隊(duì)列空時(shí)調(diào)用該函數(shù)會(huì)一直阻塞,直到隊(duì)列中有任務(wù)可獲取為止。如果 timeout 是正數(shù),則最多阻塞 timeout 秒,如果這段時(shí)間內(nèi)還沒有任務(wù)可獲取,則會(huì)引發(fā) Empty 異常。

    >>> import queue>>> q = queue.Queue()>>> q.put(100)>>> q.get()100>>> q.get(True,2)Traceback (most recent call last): File “”, line 1, in File “E:Python37-32libqueue.py”, line 178, in get raise Empty_queue.Empty # 2 秒鐘內(nèi)沒有任務(wù)可獲取則引發(fā) Empty 異常>>> q.get() # 該方法會(huì)一直阻塞

    當(dāng) block 為 false 時(shí),timeout 參數(shù)將失效。同時(shí)如果隊(duì)列中沒有任務(wù)可獲取則會(huì)立刻引發(fā) Empty 異常,否則會(huì)直接獲取一個(gè)任務(wù)并返回,不會(huì)阻塞。

    >>> import queue>>> q = queue.Queue()>>> q.put(100)>>> q.get()100>>> q.get(False,2)Traceback (most recent call last): File “”, line 1, in File “E:Python37-32libqueue.py”, line 167, in get raise Empty_queue.Empty # 指定為非阻塞模式,隊(duì)列為空則立即引發(fā) Empty 異常

    另外,還可以通過 Queue.get_nowait() 來獲取任務(wù),相當(dāng)于 Queue.get(False),不再贅述。同樣,在隊(duì)列為空時(shí),該操作會(huì)引發(fā) Empty 異常。

    其他常用方法

    1、獲取隊(duì)列大小

    Queue.qsize() 函數(shù)返回隊(duì)列的大小。注意這個(gè)大小不是精確的,qsize() > 0 不保證后續(xù)的 get() 不被阻塞,同樣 qsize() < maxsize 也不保證 put() 不被阻塞。

    >>> import queue>>> q = queue.Queue()>>> q.put(100)>>> q.put(200)>>> q.qsize()2

    2、判斷隊(duì)列是否空

    如果隊(duì)列為空,返回 True ,否則返回 False 。如果 empty() 返回 True ,不保證后續(xù)調(diào)用的 put() 不被阻塞。類似的,如果 empty() 返回 False ,也不保證后續(xù)調(diào)用的 get() 不被阻塞。

    3、判斷隊(duì)列是否滿

    如果隊(duì)列是滿的返回 True ,否則返回 False 。如果 full() 返回 True 不保證后續(xù)調(diào)用的 get() 不被阻塞。類似的,如果 full() 返回 False 也不保證后續(xù)調(diào)用的 put() 不被阻塞。

    >>> import queue>>> q = queue.Queue(maxsize=1)>>> q.empty()True>>> q.full()False>>> q.put(100)>>> q.empty()False>>> q.full()True

    隊(duì)列對比

    1、FIFO 隊(duì)列

    queue.Queue() 是 FIFO 隊(duì)列,出隊(duì)順序跟入隊(duì)順序是一致的。

    import queueq = queue.Queue()for index in range(10): q.put(index)while not q.empty(): print(q.get(), end=”, “)## 輸出結(jié)果如下0, 1, 2, 3, 4, 5, 6, 7, 8, 9,

    2、LIFO 隊(duì)列

    queue.LifoQueue() 是 LIFO 隊(duì)列,出隊(duì)順序跟入隊(duì)順序是完全相反的,類似于棧。

    import queueq = queue.LifoQueue() # 創(chuàng)建一個(gè) LIFO 隊(duì)列for index in range(10): q.put(index)while not q.empty(): print(q.get(), end=”, “)## 輸出結(jié)果如下9, 8, 7, 6, 5, 4, 3, 2, 1, 0,

    3、優(yōu)先級隊(duì)列

    優(yōu)先級隊(duì)列中的任務(wù)順序跟放入時(shí)的順序是無關(guān)的,而是按照任務(wù)的大小來排序,最小值先被取出。那任務(wù)比較大小的規(guī)則是怎么樣的呢。

    3.1 如果是內(nèi)置類型,比如數(shù)值或者字符串,則按照自然順序來比較排序。

    import queueq = queue.PriorityQueue()for index in range(10,0,-1): q.put(index)while not q.empty(): print(q.get(), end=”, “)## 輸出結(jié)果如下1, 2, 3, 4, 5, 6, 7, 8, 9, 10,

    3.2 如果是列表或者元祖,則先比較第一個(gè)元素,然后比較第二個(gè),以此類推,直到比較出結(jié)果

    import queueq = queue.PriorityQueue()q.put([“d”,”b”])q.put([“c”,”b”])while not q.empty(): print(q.get(), end=”, “)## 輸出結(jié)果如下[‘c’, ‘b’], [‘d’, ‘b’],

    注意,因?yàn)榱斜淼谋容^對規(guī)則是按照下標(biāo)順序來比較的,所以在沒有比較出大小之前 ,隊(duì)列中所有列表對應(yīng)下標(biāo)位置的元素類型要一致。

    好比 [2,1] 和 [“1″,”b”] 因?yàn)榈谝粋€(gè)位置的元素類型不一樣,所以是沒有辦法比較大小的,所以也就放入不了優(yōu)先級隊(duì)列。

    然而對于 [2,1] 和 [1,”b”] 來說即使第二個(gè)元素的類型不一致也是可以放入優(yōu)先級隊(duì)列的,因?yàn)橹恍枰容^第一個(gè)位置元素的大小就可以比較出結(jié)果了,就不需要比較第二個(gè)位置元素的大小了。

    但是對于 [2,1] 和 1[2,”b”] 來說,則同樣不可以放入優(yōu)先級隊(duì)列,因?yàn)樾枰容^第二個(gè)位置的元素才可以比較出結(jié)果,然而第二個(gè)位置的元素類型是不一致的,無法比較大小。

    綜上,也就是說,直到在比較出結(jié)果之前,對應(yīng)下標(biāo)位置的元素類型都是需要一致的。

    3.3 如果是自定義類型,需要實(shí)現(xiàn)__lt__比較函數(shù)

    下面我們自定義一個(gè)動(dòng)物類型,希望按照年齡大小來做優(yōu)先級排序。年齡越小優(yōu)先級越高。

    import queueq = queue.PriorityQueue()class Animal: def __init__(self, age, name): self.age = age self.name = name def __lt__(self, other): # 實(shí)現(xiàn) < 操作 return self.age < other.age # 如果將 則相當(dāng)于逆序q.put(Animal(3,"cat"))q.put(Animal(2,"dog"))while not q.empty(): animal = q.get() print(animal.name, animal.age, end=", ")## 輸出結(jié)果如下dog 2, cat 3,

    Queue 總結(jié)

    本章節(jié)介紹了隊(duì)列以及其常用操作。因?yàn)殛?duì)列默認(rèn)實(shí)現(xiàn)了鎖原語,因此在多線程編程中就不需要再考慮多線程安全問題了,對于程序員來說相當(dāng)友好了。

    鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場,版權(quán)歸原作者所有,如有侵權(quán)請聯(lián)系管理員(admin#wlmqw.com)刪除。
    用戶投稿
    上一篇 2022年7月10日 06:35
    下一篇 2022年7月10日 06:35

    相關(guān)推薦

    • 存儲(chǔ)過程語法(sql server存儲(chǔ)過程語法)

      今天小編給各位分享存儲(chǔ)過程語法的知識,其中也會(huì)對sql server存儲(chǔ)過程語法進(jìn)行解釋,如果能碰巧解決你現(xiàn)在面臨的問題,別忘了關(guān)注本站,現(xiàn)在開始吧! oracle存儲(chǔ)過程基本語法…

      2022年11月26日
    • 抖音帶貨怎么做入門(抖音帶貨怎么做入門教學(xué))

      相信很多小伙伴都有注意到,現(xiàn)在抖音已經(jīng)成為大家最常光顧的一個(gè)平臺(tái)了,作為一個(gè)日活破億的流量池,如今抖音上的用戶數(shù)量極大。因此,現(xiàn)在在抖音上帶貨、賣貨的人也是越來越多了,那么想在抖音…

      2022年11月25日
    • 寶可夢朱紫寶主順序怎么選擇?寶可夢朱紫寶主挑戰(zhàn)順序攻略

      寶可夢朱紫寶主順序如何選擇?寶主挑戰(zhàn)的順序有很多玩家都加入了討論,大家想要了解清楚正確的挑戰(zhàn)順序,接下來小編就給大家簡單的介紹一下寶主挑戰(zhàn)的順序,各位趕緊通過下面的攻略多了解一下詳…

      2022年11月25日
    • 《光遇》11月25日紅石在哪里 11.25紅石位置

      光遇11月25日的紅石出現(xiàn)在霞谷圓夢村,許多小伙伴都還不知道它具體在哪,下面就讓小編來給大家介紹一下光遇11.25紅石的位置,感興趣的小伙伴快來看看吧。 光遇11.25紅石位置 1…

      2022年11月25日
    • 《光遇》11月25日季節(jié)蠟燭在哪 11.25季節(jié)蠟燭位置2022

      光遇季節(jié)蠟燭的位置每天都會(huì)變化,今天出現(xiàn)在了雨林地區(qū),下面小編就給大家?guī)砹斯庥?1.25季節(jié)蠟燭位置分享,有需要的小伙伴不要錯(cuò)過哦。 光遇11.25季節(jié)蠟燭位置2022 今日季節(jié)…

      2022年11月25日
    • 什么是推廣cpa一篇文章帶你看懂CPA推廣渠道

      CPA渠道 CPA指的是按照指定的行為結(jié)算,可以是搜索,可以是注冊,可以是激活,可以是搜索下載激活,可以是綁卡,實(shí)名認(rèn)證,可以是付費(fèi),可以是瀏覽等等。甲乙雙方可以根據(jù)自己的情況來定…

      2022年11月25日
    • 《原神》3.2無相交響詩第一天無相之冰怎么打?無相交響詩攻略

      原神3.2無相交響詩第一天無相之冰怎么打?最近新版本3.2版本的無相交響詩活動(dòng)又開啟了,不少玩家還不清楚具體的玩法,下面一起來看一下原神被隱去的原神3.2無相交響詩第一天無相之冰打…

      2022年11月24日
    • 《寶可夢朱紫》樁子是什么?二級神封印樁位置一覽

      寶可夢朱紫中有一種叫做二級神封印樁的特殊收集道具,很多玩家不知道寶可夢朱紫樁子是什么,下面就帶來寶可夢朱紫二級神封印樁位置一覽,感興趣的小伙伴不要錯(cuò)過,希望能幫助到大家。 二級神封…

      2022年11月24日
    • 淘寶直播開通后帶貨鏈接怎么做(淘寶直播需要開通淘寶店鋪嗎)

      直播帶貨無論是對于商家來說還是主播收益都是非常可觀的,所以不少平臺(tái)都有直播帶貨功能,一些小伙伴也想加入淘寶直播,那么淘寶直播開通后帶貨鏈接怎么做?下面小編為大家?guī)硖詫氈辈ラ_通后帶…

      2022年11月24日
    • 寶可夢朱紫道館及寶主攻略順序是什么 道館及寶主攻略順序匯總

      作為寶可夢資深愛好者,小伙伴們對寶可夢朱紫里面的所有道館恨不得馬上跳過,當(dāng)場就來挑戰(zhàn)地區(qū)冠軍,但這顯然是不可能的,你得按照游戲里面遇到的順序來進(jìn)行挑戰(zhàn)。那么具體的挑戰(zhàn)順序是什么樣的…

      2022年11月24日

    聯(lián)系我們

    聯(lián)系郵箱:admin#wlmqw.com
    工作時(shí)間:周一至周五,10:30-18:30,節(jié)假日休息