python筆記29-隊列Queue

2021-02-20 從零開始學自動化測試
前言

Python的Queue模塊提供一種適用於多線程編程的FIFO實現。它可用於在生產者(producer)和消費者(consumer)之間線程安全(thread-safe)地傳遞消息或其它數據,因此多個線程可以共用同一個Queue實例。Queue的大小(元素的個數)可用來限制內存的使用。
python2和python3的導入不一樣,python2是import Queue,python3是import queue

3種Queue類型

FIFO:class Queue.Queue(maxsize=0)
FIFO即First in First Out,先進先出。Queue提供了一個基本的FIFO容器,使用方法很簡單,maxsize是個整數,指明了隊列中能存放的數據個數的上限。一旦達到上限,插入會導致阻塞,直到隊列中的數據被消費掉。如果maxsize小於或者等於0,隊列大小沒有限制。

LIFO:class Queue.LifoQueue(maxsize=0)
即Last in First Out,後進先出。與棧的類似,maxsize用法同上

優先級隊列 :class Queue.PriorityQueue(maxsize=0)
構造一個優先隊列。maxsize用法同上。

常用方法:

Queue.qsize() 返回隊列的大小

Queue.empty() 如果隊列為空,返回True,反之False

Queue.full() 如果隊列滿了,返回True,反之False

Queue.full 與 maxsize 大小對應

Queue.get([block[, timeout]])獲取隊列,timeout等待時間

Queue.get_nowait() 相當Queue.get(False)

Queue.put(item) 寫入隊列,timeout等待時間

Queue.put_nowait(item) 相當Queue.put(item, False)

Queue.task_done() 在完成一項工作之後,Queue.task_done()函數向任務已經完成的隊列發送一個信號

Queue.join() 實際上意味著等到隊列為空,再執行別的操作

get和put

Queue.get是從隊列裡拿數據,Queue.put是往隊列添加數據

import queue# 設置上限maxsize=10q = queue.Queue(maxsize=10)# 往隊列加10個數據for i in range(100):    if q.qsize() >= 10:        # 存放的數據達到上限maxsize,插入會導致阻塞        break    else:        q.put(i)# 從隊列取值while not q.empty():    n = q.get()    print("本次取出數據:%s" % n)

運行結果:
本次取出數據:0
本次取出數據:1
本次取出數據:2
本次取出數據:3
本次取出數據:4
本次取出數據:5
本次取出數據:6
本次取出數據:7
本次取出數據:8
本次取出數據:9

Queue與threading

# utf-8import queueimport threadingimport timeexitFlag = 0class myThread (threading.Thread):    def __init__(self, threadID, name, q):        threading.Thread.__init__(self)        self.threadID = threadID        self.name = name        self.q = q    def run(self):        print("Starting " + self.name)        process_data(self.name, self.q)        print("Exiting " + self.name)def process_data(threadName, q):    while not exitFlag:        queueLock.acquire()        if not workQueue.empty():            data = q.get()            queueLock.release()            print("%s processing %s" % (threadName, data))        else:            queueLock.release()        time.sleep(1)users = ["user-1", "user-2", "user-3"]usernames = ["name1", "name2", "name3", "name4", "name5", "name6", "name7", "name8", "name9", "name10"]queueLock = threading.Lock()workQueue = queue.Queue(10)threads = []threadID = 1# 創建新線程for tName in users:    thread = myThread(threadID, tName, workQueue)    thread.start()    threads.append(thread)    threadID += 1# 填充隊列queueLock.acquire()for word in usernames:    workQueue.put(word)queueLock.release()# 等待隊列清空while not workQueue.empty():    pass# 通知線程是時候退出exitFlag = 1# 等待所有線程完成for t in threads:    t.join()print("Exiting Main Thread")

運行結果:
Starting user-1
Starting user-2
Starting user-3
user-3 processing name1
user-2 processing name2
user-1 processing name3
user-3 processing name4
user-2 processing name5
user-1 processing name6
user-3 processing name7
user-2 processing name8
user-1 processing name9
user-3 processing name10
Exiting user-2
Exiting user-1
Exiting user-3
Exiting Main Thread

《python3自動化接口+selenium》10月07號開學!(包教會)

主講老師:上海-悠悠上課方式:QQ群視頻在線教學報名費2000一人(周期2個月)聯繫QQ:283340479

《Python3自動化接口+selenium課程》10月13號開學

相關焦點

  • Python 進階:queue 隊列源碼分析
    它要處理超時與隊列剩餘空間不足的情況,具體幾種情況如下:如果 block 是 False,忽略timeout參數若此時隊列未滿,則立即把元素保存到底層數據結構中;若 timeout 是 None 時,那麼put操作可能會阻塞,直到隊列中有空閒的空間(默認);若 timeout 是非負數,則會阻塞相應時間直到隊列中有剩餘空間,在這個期間,如果隊列中一直沒有空間,拋出 Full 異常;
  • Python 源碼分析:queue 隊列模塊
    _qsize()    def _qsize(self):        return len(self.queue)這個代碼片段挺好理解的,無需分析。作為隊列,主要得完成入隊與出隊的操作,首先是入隊:class Queue:    ...
  • Postfix queue(郵件隊列) 管理
    From time to time the mail queue may get filled up.本文引用地址:http://www.eepw.com.cn/article/201609/304130.htm1. try and deliver the mail from the queue(強制發送隊列中的郵件):$ postfix flush or $ postqueue
  • 帶UI界面的代碼統計小工具--進程、隊列的並發應用
    遍歷目錄下的所有文件,將所有python,java,C文件路徑放到隊列裡。2.    創建多個進程,從隊列中獲取文件路徑,分別統計各類型文件的代碼行數。3.    將統計的結果,存放到一個變量裡,並且實現多進程間變量共享。4.    製作一個圖形界面,用於選擇文件夾和統計代碼,並展示統計結果。
  • Python使用Queue對象實現多線程同步小案例
    queue模塊的Queue對象實現了多生產者/多消費者隊列,尤其適合需要在多個線程之間進行信息交換的場合,實現了多線程編程所需要的所有鎖語義。
  • Python多線程實戰
    2 Python線程模塊python主要是通過thread和threading這兩個模塊來實現多線程支持。python的thread模塊是比較底層的模塊,python的threading模塊是對thread做了一些封裝,可以更加方便的被使用。
  • 如何在python中引入高性能數據類型?
    作者|skura 來源|AI開發者 python 就像一件藝術珍藏品!python 最大的優點之一是它可以廣泛地選擇模塊和包。它們將 python 的功能擴展到許多流行的領域,包括機器學習、數據科學、web 開發、前端等等。其中最好的一個優點是 python 的內置 collections 模塊。
  • C++ 優先隊列priority_queue
    學習優先隊列之前先看個單詞隊列 queue, 這個單詞的讀法很多人都能讀對吧,音標是 /kjuː/ ,再看一個雙端隊列 deque,它的音標是
  • 【學習筆記】超全面的 Python 重點
    Py2 VS Py3print成為了函數,python2是關鍵字不再有unicode對象,默認str就是unicodepython3除號返回浮點數沒有了long類型xrange不存在,range替代了xrange可以使用中文定義函數名變量名高級解包 和*解包
  • 深入理解Java PriorityQueue
    總體介紹前面以Java ArrayDeque為例講解了Stack和Queue,其實還有一種特殊的隊列叫做PriorityQueue,即優先隊列。優先隊列的作用是能保證每次取出的元素都是隊列中權值最小的(Java的優先隊列每次取最小元素,C++的優先隊列每次取最大元素)。
  • 輕量級消息隊列RedisQueue
    消息隊列(Message Queue)是分布式系統必不可少的中間件,大部分消息隊列產品(如RocketMQ/RabbitMQ/Kafka等)要求團隊有比較強的技術實力,不適用於中小團隊,並且對.NET技術的支持力度不夠。而Redis實現的輕量級消息隊列很簡單,僅有Redis常規操作,幾乎不需要開發團隊掌握額外的知識!
  • Java中常用的七個阻塞隊列第二篇DelayQueue源碼介紹
    Java中常用的七個阻塞隊列第二篇DelayQueue源碼介紹通過前面兩篇文章,我們對隊列有了了解及已經認識了常用阻塞隊列中的三個了。本篇我們繼續介紹剩下的幾個隊列。本文主要內容:通過源碼學習Delayqueue及理解Dqueue並用代碼簡單演示使用場景。
  • 消息隊列 NSQ 源碼學習筆記 (三)
    e2eProcessingLatencyStream *quantile.Quantile  deferredMessages map[MessageID]*pqueue.Item  // defer 消息保存的map  deferredPQ
  • JS 數據結構與算法——棧 & 隊列
    const headItem = queue.head();const nextItem = delItem + headItem; queue.enqueue(nextItem);}return queue.tail();}console.log(fibonacci(9));// 34(3)用隊列實現一個棧要求:用兩個隊列實現一個棧。
  • 加快程序運行速度只需一行 Python 代碼
    問題在於…首先,你需要一個樣板類; 其次,你需要一個隊列來傳遞對象; 而且,你還需要在通道兩端都構建相應的方法來協助其工作(如果需想要進行雙向通信或是保存結果還需要再引入一個隊列)。worker 越多,問題越多按照這一思路,你現在需要一個 worker 線程的線程池。
  • java中的Queue隊列的用法
    01 何為隊列? 隊列是一種特殊數據結構,它只允許在表的前端進行刪除操作,而在表的後端進行插入操作,「先進先出」的場景,和我們生活中的排隊類似,誰先來先給誰辦理。
  • 要想實現EventQueue,那麼該Queue應有的三種狀態代碼,都在這了
    實現一個EventQueue,該Queue有如下三種狀態:隊列滿——最多可容納多少個Event,好比一個系統最多同時能夠受理多少業務一樣;隊列空——當所有的Event都被處理並且沒有新的Event被提交的時候,此時隊列將是空的狀態;有Event
  • 一行代碼實現Python並行處理
    問題在於…而且,你還需要在通道兩端都構建相應的方法來協助其工作(如果需想要進行雙向通信或是保存結果還需要再引入一個隊列)。worker 越多,問題越多按照這一思路,你現在需要一個 worker 線程的線程池。下面是一篇 IBM 經典教程中的例子——在進行網頁檢索時通過多線程進行加速。
  • linux kernel工作隊列及源碼詳細講解
    wait_queue_head_t more_work;// 處理完的等待隊列wait_queue_head_t work_done;// 工作隊列節點struct workqueue_struct *wq;// 進程指針struct task_struct *thread;int run_depth; /* Detect
  • Fluent Python - Part2 序列構成的數組
    中,列表推導中的變量會覆蓋外部的同名變量,而在 python3 中則不會。memv[0]-2>>> memv_oct = memv.cast('B')>>> memv_oct.tolist()[254, 255, 255, 255, 0, 0, 1, 0, 2, 0]>>> memv_oct[5] = 4>>> numbersarray('h', [-2, -1, 1024, 1, 2])雙向隊列和其他形式的隊列其他隊列