Python數據結構之優先級隊列queue用法詳解

一、基本用法

Queue類實現瞭一個基本的先進先出容器。使用put()將元素增加到這個序列的一端,使用get()從另一端刪除。具體代碼如下所示:

import queue

q = queue.Queue()

for i in range(1, 10):
    q.put(i)
while not q.empty():
    print(q.get(), end="  ")

運行之後,效果如下:

基本用法

這裡我們依次添加1到10到隊列中,因為先進先出,所以出來的順序也與添加的順序相同。

二、LIFO隊列

既然有先進先出隊列queue,那麼數據結構中肯定也有後進先出的隊列。後進先出的隊列為:LifoQueue,示例如下:

import queue

q = queue.LifoQueue()

for i in range(1, 10):
    q.put(i)
while not q.empty():
    print(q.get(), end="  ")

運行之後,效果如下:

後進先出

三、優先隊列

在操作系統中,我們常常會根據優先級來處理任務,比如系統的優先級最高,我們肯定優先處理系統任務,然後才處理用戶的任務。同樣,queue庫給我們提供瞭PriorityQueue來處理優先級的隊列。

示例如下:

import queue
import threading


class Job:
    def __init__(self, priority, desc):
        self.priority = priority
        self.desc = desc
        print("New Job:", desc)
        return

    def __eq__(self, other):
        try:
            return self.priority == other.priority
        except AttributeError:
            return NotImplemented

    def __lt__(self, other):
        try:
            return self.priority > other.priority
        except AttributeError:
            return NotImplemented


def process_Job(q):
    while True:
        next_job = q.get()
        print(next_job.desc)
        q.task_done()


q = queue.PriorityQueue()

q.put(Job(5, "Five Job"))
q.put(Job(15, "Fifteen Job"))
q.put(Job(1, "One Job"))

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

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

q.join()

運行之後,效果如下:

優先級

這裡,我們默認數值越大優先級越高,可以看到15先執行,然後再是5,1任務。這個例子展現瞭有多個線程在處理任務時,要根據get()時隊列中元素的優先級來處理。

到此這篇關於Python數據結構之優先級隊列queue用法詳解的文章就介紹到這瞭,更多相關Python隊列queue 內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: