寫Python爬蟲不可不理解隊列Queue

2021-02-20 Python入門與進階

Queue是python標準庫中的線程安全的隊列(FIFO)實現,提供了一個適用於多線程編程的先進先出的數據結構,即隊列,用來在生產者和消費者線程之間的信息傳遞

基本FIFO隊列

class Queue.Queue(maxsize=0)

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

舉個慄子:

import Queue

q = Queue.Queue()

for i in range(5):
   q.put(i)

while not q.empty():
   print q.get()

輸出:

0
1
2
3
4

LIFO隊列

class Queue.LifoQueue(maxsize=0)

LIFO即Last in First Out,後進先出。與棧的類似,使用也很簡單,maxsize用法同上

再舉個慄子:

import Queue

q = Queue.LifoQueue()

for i in range(5):
   q.put(i)

while not q.empty():
   print q.get()

輸出:

4
3
2
1
0

可以看到僅僅是將Queue.Quenu類替換為Queue.LifiQueue類

優先級隊列

class Queue.PriorityQueue(maxsize=0)

構造一個優先隊列。maxsize用法同上。

import Queue
import threading

class Job(object):
   def __init__(self, priority, description):
       self.priority = priority
       self.description = description
       print 'Job:',description
       return
   def __cmp__(self, other):
       return cmp(self.priority, other.priority)

q = Queue.PriorityQueue()

q.put(Job(3, 'level 3 job'))
q.put(Job(10, 'level 10 job'))
q.put(Job(1, 'level 1 job'))

def process_job(q):
   while True:
       next_job = q.get()
       print 'for:', next_job.description
       q.task_done()

workers = [threading.Thread(target=process_job, args=(q,)),
       threading.Thread(target=process_job, args=(q,))
       ]

for w in workers:
   w.setDaemon(True)
   w.start()

q.join()

結果

Job: level 3 job
Job: level 10 job
Job: level 1 job
for: level 1 job
for: level 3 job
for: job: level 10 job

一些常用方法task_done()

意味著之前入隊的一個任務已經完成。由隊列的消費者線程調用。每一個get()調用得到一個任務,接下來的task_done()調用告訴隊列該任務已經處理完畢。

如果當前一個join()正在阻塞,它將在隊列中的所有任務都處理完時恢復執行(即每一個由put()調用入隊的任務都有一個對應的task_done()調用)。

join()

阻塞調用線程,直到隊列中的所有任務被處理掉。

只要有數據被加入隊列,未完成的任務數就會增加。當消費者線程調用task_done()(意味著有消費者取得任務並完成任務),未完成的任務數就會減少。當未完成的任務數降到0,join()解除阻塞。

put(item[, block[, timeout]])

將item放入隊列中。

如果可選的參數block為True且timeout為空對象(默認的情況,阻塞調用,無超時)。
如果timeout是個正整數,阻塞調用進程最多timeout秒,如果一直無空空間可用,拋出Full異常(帶超時的阻塞調用)。
如果block為False,如果有空閒空間可用將數據放入隊列,否則立即拋出Full異常
其非阻塞版本為put_nowait等同於put(item, False)

get([block[, timeout]])

從隊列中移除並返回一個數據。block跟timeout參數同put方法

其非阻塞方法為`get_nowait()`相當與get(False)

empty()

如果隊列為空,返回True,反之返回False

你學會了嗎?

原文地址:https://www.cnblogs.com/itogo/p/5635629.html

學習Python就關注:datanami

近期文章:

AI零基礎搭建聊天機器人(小白首選)

坑爹的Python陷阱

30個有關Python的小技巧

Python 實現多線程下載器

Python新手收藏這一篇就夠了

相關焦點

  • Python 內置的隊列 Queue
    Python 內置的隊列 Queue在 python 的眾多標準庫中,有一個 Queue
  • Python Queue隊列實現線程通信
    queue 模塊下提供了幾個阻塞隊列,這些隊列主要用於實現線程通信。
  • Python中的雙端隊列:collections.deque
    關於deque起因是我想做一個「手氣不錯」的功能,為了提高性能,打算用隊列實現,偶然在Stack Overflow看到一個討論「Efficiency of using a Python list as a queue」python的list有pop方法,可以實現隊列的取出功能,不過據說性能一般般,高贊回答說的❝You won't run out of memory using the list implementation
  • Smaller Python數據結構:自己動手實現隊列
    今日問題"""目標:實現隊列,使其具有方法:入隊列(push_queue)、出隊列(pop_queue)、取隊列首元素(get_top)、取隊列尾元素(get_tail)、判斷隊列是否為空(is_empty)、獲取隊列中元素個數(size)為後面操作打基礎Goal: To implement the queue, there
  • 聊聊學python轉行、具體學習方法、自學python用於辦公、寫爬蟲等...
    那今天就來說說學python這件事兒吧,從三個方面來說:第一,學了python之後轉行找工作的問題;第二,具體的學習方法;第三,講講學了python之後應用於辦公自動化和寫爬蟲。4600字。關於恰飯:不用猜了,這篇依舊沒有廣告。
  • STL 之 priority_queue 優先級隊列
    priority_queue 優先級隊列,鄙人以為這是一種很重要的迭代器,重要到是圖論位必備技能。
  • 分布式任務隊列 Celery — 應用基礎
    快速入門分布式消息隊列之 RabbitMQ(上)快速入門分布式消息隊列之 RabbitMQ(中)快速入門分布式消息隊列之 RabbitMQ(下)簡介Celery 是一個簡單、靈活且可靠的分布式任務隊列(Distributed Task Queue)。
  • Python實戰 | 只需 「4步」 入門網絡爬蟲
    網絡爬蟲(Web crawler),就是通過網址獲得網絡中的數據、然後根據目標解析數據、存儲目標信息。
  • Python破解反爬蟲:最新反爬蟲有道翻譯中英文互譯破解,附代碼
    由於爬蟲的出現,導致很多網頁都設置了反爬蟲機制:常見的反爬蟲機制就是在客戶端發出請求的時候,在請求的內容中新增一些內容,而這些內容都是經過「加密的」,每次請求都是不同的,這樣就導致了很多傳統的爬蟲失效。
  • Python爬蟲實戰 | 只需 「4步」 入門網絡爬蟲(有福利哦)
    網絡爬蟲也是獲取數據的一個途徑。對於大數據行業,數據的價值不言而喻,在這個信息爆炸的年代,網際網路上有太多的信息數據,對於中小微公司,合理利用爬蟲爬取有價值的數據,是彌補自身先天數據短板的不二選擇。在py
  • C++ 優先隊列priority_queue
    queue, 這個單詞的讀法很多人都能讀對吧,音標是 /kjuː/ ,再看一個雙端隊列 deque,它的音標是 /dek/,應該有人讀錯了吧,反正我是沒讀對,剛開始看見一次錯一次,現在還好了,基本能記住怎麼讀了,可是這些隊列怎麼用呢?
  • 什麼是Python網絡爬蟲?看這篇清晰多了!
    網絡爬蟲也是獲取數據的一個途徑。對於大數據行業,數據的價值不言而喻,在這個信息爆炸的年代,網際網路上有太多的信息數據,對於中小微公司,合理利用爬蟲爬取有價值的數據,是彌補自身先天數據短板的不二選擇。在py
  • Python網絡爬蟲
    Python網絡爬蟲第一篇(一):為什麼要學習網絡爬蟲?大數據成為當今時代的熱門話題之一,在數據量爆發增長的網際網路時代,網站與用戶溝通實質為數據的交換。如果大量的數據得以分析,我們能夠對事件的看法,解決方案做出更好的決策。
  • 和LinkedBlockingQueue驚人相似的ArrayBlockingQueue!
    上一節講了有界的阻塞隊列LinkedBlockingQueue,這一節趁熱打鐵,來學習下另一個有界阻塞隊列ArrayBlockingQueue。當你學完這一節後,就可以自己對比出它倆有什麼區別了和各自的優劣之分了。
  • 使用Scrapy網絡爬蟲框架小試牛刀
    前言這次咱們來玩一個在Python中很牛叉的爬蟲框架——Scrapy。scrapy 介紹標準介紹Scrapy是一個為了爬取網站數據,提取結構性數據而編寫的應用框架,非常出名,非常強悍。所謂的框架就是一個已經被集成了各種功能(高性能異步下載,隊列,分布式,解析,持久化等)的具有很強通用性的項目模板。
  • Client-go Informer之 DeltaFIFO隊列
    我們通過學習其中的FIFO隊列來了解Golang語言中設計FIFO隊列的基本技巧,而學習DeltaFIFO隊列是深入理解Inform機制所需,為後面的文章打下基礎。f.queue[0] // 拿出隊列首位 f.queue = f.queue[1:] // 隊首元素出隊後修正有序數組 if f.initialPopulationCount > 0 { f.initialPopulationCount-- // 隊列元素總數計數 } item
  • 如何快速學會Python爬蟲(入門篇)
    Python爬蟲入門二之爬蟲基礎了解3. Python爬蟲入門三之Urllib庫的基本使用4. Python爬蟲入門四之Urllib庫的高級用法5. Python爬蟲入門五之URLError異常處理6.
  • leetcode-406 根據身高重建隊列
    題目https://leetcode-cn.com/problems/queue-reconstruction-by-height
  • RabbitMQ實戰教程(一)——簡單隊列和工作隊列
    生產者可以不斷往消息隊列裡寫消息。消費者可以從隊列裡消費消息。2、MQ有什麼好處生產者不用關心消費者有沒有消費,只用把消息發到消息隊列裡就可以了。消費者不用關心生產者有沒有發消息,只關心隊列裡有沒有消息就可以了。整個過程沒有API侵入,輕鬆實現了系統之間的解耦。
  • 雲立方網科普:常用高效的Python爬蟲框架有哪些?
    Python是現在非常流行的程式語言,而爬蟲則是Python語言中最典型的應用,下面是總結的高效Python爬蟲框架,大家看看是否都用過呢。