Python多線程3:queue

queue模塊實現了多生產者。多消費者隊列。在多線程環境下,該隊列能實現多個線程間安全的信息交換。

queue模塊介紹

模塊實現了3種類型的隊列,差別在于隊列中條目檢索的順序不同。

在FIFO隊列中。依照先進先出的順序檢索條目。在LIFO隊列中,最后加入的條目最先檢索到(操作類似一個棧)。在優先級隊列中,條目被保存為有序的(使用heapq模塊)而且最小值的條目被最先檢索。


queue模塊定義了以下的類和異常:

class queue.Queue(maxsize=0)

FIFO隊列的構造器。maxsize為一個整數。表示隊列的最大條目數。一旦隊列滿,插入將被堵塞直到隊列中存在空暇空間。假設maxsize小于等于0。隊列大小為無限。


class queue.LifoQueue(maxsize=0)

LIFO隊列的構造器。

maxsize是一個整數,表示隊列的最大條目數。一旦隊列滿,插入將被堵塞直到隊列中存在空暇空間。假設maxsize小于等于0,隊列大小為無限。


class queue.PriorityQueue(maxsize=0)

優先級隊列的構造器。maxsize是一個整數,表示隊列的最大條目數。一旦隊列滿,插入將被堵塞直到隊列中存在空暇空間。

假設maxsize小于等于0,隊列大小為無限。


最小值的條目被最先檢索到(最小值的條目即為被sorted(list(entries))[0]返回的條目)。

通常一個條目被保存為以下的形式:(priority_number, data)。

exception queue.Empty

當Queue為空時,非堵塞的get()或者get_nowait()被調用時,將拋出該異常。


exception queue.Full

當隊列滿時,非堵塞的put()或者put_nowait()被調用,將拋出該異常。

Queue對象

Queue對象(Queue、LifoQueue或者PriorityQueue)提供了下面方法:


Queue.qsize()
返回隊列的近似大小。注意,qsize() > 0并不能保證接下來的get()方法不被堵塞。相同。qsize() < maxsize也不能保證put()將不被堵塞。

Queue.empty()
假設隊列是空的。則返回True,否則False。假設empty()返回True,并不能保證接下來的put()調用將不被堵塞。類似的。empty()返回False也不能保證接下來的get()調用將不被堵塞。

Queue.full()
假設隊列滿則返回True,否則返回False。假設full()返回True,并不能保證接下來的get()調用將不被堵塞。

類似的,full()返回False也不能保證接下來的put()調用將不被堵塞。

Queue.put(item, block=True, timeout=None)
放item到隊列中。假設block是True,且timeout是None。該方法將一直等待直到有隊列有空余空間。假設timeout是一個正整數,該方法則最多堵塞timeout秒并拋出Full異常。假設block是False而且隊列滿,則直接拋出Full異常(這時timeout將被忽略)。



Queue.put_nowait(item)
等價于put(item, False)。

Queue.get(block=True, timeout=None)
從隊列中移除被返回一個條目。假設block是True而且timeout是None,該方法將堵塞直到隊列中有條目可用。假設timeout是正整數,該方法將最多堵塞timeout秒并拋出Empty異常。假設block是False而且隊列為空。則直接拋出Empty異常(這時timeout將被忽略)。



Queue.get_nowait()
等價于get(False)。

假設須要跟蹤進入隊列中的任務是否已經被精靈消費者線程處理完畢,能夠使用以下提供的兩個方法:


Queue.task_done()
表示一個先前的隊列中的任務完畢了。被隊列消費者線程使用。對于每一個get()獲取到的任務,接下來的task_done()的調用告訴隊列該任務的處理已經完畢。


假設join()調用正在堵塞,當隊列中全部的條目被處理后它將恢復運行(意味著task_done()調用將被放入隊列中的每一個條目接收到)。


假設調用次數超過了隊列中放置的條目數目,將拋出ValueError異常。

Queue.join()
堵塞直到隊列中全部條目都被獲取并處理。
當一個條目被添加到隊列時,未完畢任務的計數將添加。當一個消費者線程調用task_done()時,未完畢任務的計數將降低。

當未完畢任務的計數降低到0時,join()解鎖。

以下是一個詳細的樣例。用于說明怎么等待隊列任務完畢:

def worker():while True:item = q.get()do_work(item)q.task_done()q = Queue()
for i in range(num_worker_threads):t = Thread(target=worker)t.daemon = Truet.start()for item in source():q.put(item)q.join()       # 堵塞直到全部任務完畢

轉載于:https://www.cnblogs.com/jzdwajue/p/7028909.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252510.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252510.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252510.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微信小程序教程02:App(Object)和Page(Object) 構造器介紹

在/app.js中&#xff0c;有方法App&#xff0c;它的作用是注冊整個小程序的應用&#xff0c;其中可以傳入一些配置&#xff0c;或者存儲全局狀態。 App(Object) 構造器生命周期 屬性類型描述onLaunchFunction在小程序初始化時觸發&#xff0c;全局僅觸發一次onShowFunction小程…

阿里云.log

申請證書審核失敗的原因及處理方法;( 新添加站點 免費版 SSL 網頁內不能有 HTTPS的連接&#xff1b;更多點擊連接) 轉載于:https://www.cnblogs.com/q1104460935/p/8287377.html

SharePoint Search之(七)Search result- 結果源

在使用搜索引擎的時候。非常多情況下&#xff0c;用戶希望限定一下搜索范圍&#xff0c;以便更加easy找到想要的結果。在SharePoint 2013的search里&#xff0c;也支持類似的功能&#xff0c;SharePoint 默認提供了幾種范圍&#xff1a; 在SharePoint&#xff0c;這個叫Search …

曠視砸20億進軍AIoT,發布國內首個機器人協作大腦河圖

1 月 16 日&#xff0c;人工智能獨角獸曠視科技發布了機器人戰略&#xff0c;以及自 2018 年 4 月收購艾瑞思機器人&#xff0c;進軍機器人領域的最新進展——智能協同大腦河圖。在會上&#xff0c;曠視還大筆一揮&#xff0c;決定投入 20 億元&#xff0c;用于打造物流倉儲上下…

ORB-SLAM2-金字塔求解-特征點的提取-描述子的計算

//這個成員函數重載了函數括號運算符&#xff0c;讓他具有函數的特點 //但是還不知道在其他程序塊是如何應用這塊代碼的。 //InputArray和OutputArray是opencv中的兩個函數接口 void ORBextractor::operator()( InputArray _image, InputArray _mask, vector<KeyPoint>&a…

am335x uboot, kernel 編譯

一、設置環境變量// 寫在家目錄下面的 .bashrc 里面export KERNEL_PATH~/aplex/kernel3.2.0 // kernel 路徑export UBOOT_PATH~/aplex/uboot2011.09 // u-boot 路勁export ROOTFS_PATH~/aplex/filesystemexport TOOLFS_PATH~/aplex/toolsexport ARCHarm …

php+ajax簡單實現跨域(http+https)請求調用

當一個網站 a站 需要調用另一個網站 b站 列表文章時 比如&#xff1a;www.a123.com 調用 www.b456.com 文章 在 a站 建立php文件獲取 b站 資源文章到本地后&#xff0c;再傳遞a站前端 在網站 b456 下的文件為 <ul class"ls_wz"> <li><a href"#&q…

ORB-SLAM2中MapPoints的描述子的計算

//我們在從金字塔的圖像中獲取特征點時為每一個特征點計算了描述子 //現在看看如何計算一個空間的地圖點的描述子 void MapPoint::ComputeDistinctiveDescriptors() {// Retrieve all observed descriptorsvector<cv::Mat> vDescriptors;//獲取到某一個地圖點可以被哪些關…

HDU:4185-Oil Skimming

Oil Skimming Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description Thanks to a certain “green” resources company, there is a new profitable industry of oil skimming. There are large slicks of crude oil floa…

域控制器情況分析

域控制器情況分析 1、Windows Server 的 Foundation、Standard、Enterprise 以及 Datacenter 版本號既可作為源server&#xff0c;也可作為目標server。僅支持將 Foundation Server 版本號作為受限方案中的目標server。在使用 Foundation Server 作為目標server之前&#xff0c…

Linux基礎命令---su

su臨時切換身份到另外一個用戶&#xff0c;使用su切換用戶之后&#xff0c;不會改變當前的工作目錄&#xff0c;但是會改變一些環境變量。此命令的適用范圍&#xff1a;RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。1、語法su [選項] [參數]2、選項列表--help顯示…

在Ubuntu 16.04 上安裝和卸載matlab 2018b(Install and uninstall matlab 2018b on ubuntu)

1.安裝2018b可以參考下面兩篇文章 https://www.ph0en1x.space/2018/04/23/ubuntu_matlab/ https://blog.csdn.net/qq_32892383/article/details/79670871 2.卸載2018b 我的默認安裝在 /usr/local/MATLAB $ sudo rm -r /usr/local/MATLAB $ cd ~ $ ll (這個時候可以看到隱…

04.openssl編程——哈希表

4.1 哈希表在一般的數據結構如線性表和樹中&#xff0c;記錄在結構中的相對位置與記錄的關鍵字之間不存在確定的關系&#xff0c;在結構中查找記錄時需要進行一系列的關鍵字比較。這一類查找方法建立在比較的基礎上&#xff0c;查找的效率與比較次數密切相關。理想的情況是能…

shell數組中“和@的妙用

#!/bin/bashlist(4k"8k a bit""16k abc""32k gold"64k)for i in "${list[]}"do echo $idone 分別對比一下不帶” 和換成*&#xff0c;之間的區別。轉載于:https://www.cnblogs.com/zjd2626/p/7041341.html

「JupyterLab」 Jupyter Notebook 新生代IDE模式頁面

參考&#xff1a;Overview 安裝&#xff1a; $ pip install jupyterlab 啟動&#xff08;不是jupyter notebook&#xff09;&#xff1a; $ jupyter lab Jupyterlab中最好用的就是顯示csv數據。CSV數據顯示效果&#xff1a; 安裝插件 jupyterlab是和jupyter notebook隔離的&…

undefined reference to 'pthread_create'

剛在Ubuntu16.04 上用Clion寫一個"單生產者-單消費者"的線程的程序&#xff0c;源程序可以參考下面的網址 https://www.cnblogs.com/haippy/p/3252092.html 在編譯的時候編譯器給的提示是&#xff1a; undefined reference to pthread_create 解決辦法就是在CMake…

windows下安裝vundle

windows下安裝vundle ## 前言 windows下安裝vundle和linux下稍微有些不一樣&#xff0c;雖然官網給出了 安裝說明&#xff0c;但是有些問題的。E117: Unknown function: vundle#begin ## 安裝步驟 參考官方文檔即可vundle ## 問題處理 修改_vimrc配置文件內容&#xff0c;這是正…

深度學習框架不能“包治百病”,開發者如何選出最適合自己的?

隨著深度學習關注度和勢頭上升&#xff0c;深度學習被越來越多的企業和組織的生產實踐結合起來。這時&#xff0c;無論是對于深度學習相關專業的初學者&#xff0c;還是已經在企業和組織中從事工業場景應用和研發的開發者來說&#xff0c;選擇一個適合自己&#xff0c;適合業務…

Linux+CLion+cmake 動態鏈接庫的使用

在作《劍指offer》中的單向鏈表的題目時&#xff0c;需要一些常用到的操作鏈表的函數放在一個文件下&#xff0c;我想把這些函數的聲明都寫在list.h文件中&#xff0c;把這些函數的定義都寫在list.cpp文件中&#xff0c;這樣就可以在測試文件test.cpp中調用list.cpp中定義的函數…