溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

如何理解Python3線(xiàn)程優(yōu)先級(jí)隊(duì)列Queue

發(fā)布時(shí)間:2021-11-06 09:07:22 來(lái)源:億速云 閱讀:166 作者:柒染 欄目:建站服務(wù)器

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)如何理解Python3線(xiàn)程優(yōu)先級(jí)隊(duì)列Queue,文章內(nèi)容豐富且以專(zhuān)業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

Python 的 Queue 模塊中提供了同步的、線(xiàn)程安全的隊(duì)列類(lèi),包括FIFO(先入先出)隊(duì)列Queue,LIFO(后入先出)隊(duì)列LifoQueue,和優(yōu)先級(jí)隊(duì)列 PriorityQueue。

這些隊(duì)列都實(shí)現(xiàn)了鎖原語(yǔ),能夠在多線(xiàn)程中直接使用,可以使用隊(duì)列來(lái)實(shí)現(xiàn)線(xiàn)程間的同步。

Queue 模塊中的常用方法:

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

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

Queue.full() 如果隊(duì)列滿(mǎn)了,返回True,反之False

Queue.full 與 maxsize 大小對(duì)應(yīng)

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

Queue.get_nowait() 相當(dāng)Queue.get(False)

Queue.put(item) 寫(xiě)入隊(duì)列,timeout等待時(shí)間

Queue.put_nowait(item) 相當(dāng)Queue.put(item, False)

Queue.task_done() 在完成一項(xiàng)工作之后,Queue.task_done()函數(shù)向任務(wù)已經(jīng)完成的隊(duì)列發(fā)送一個(gè)信號(hào)

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

實(shí)例:

#!/usr/bin/python3
import queue
import threading
import time
exitFlag = 0
class 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 ("開(kāi)啟線(xiàn)程:" + self.name)
        process_data(self.name, self.q)
        print ("退出線(xiàn)程:" + 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)
threadList = ["Thread-1", "Thread-2", "Thread-3"]
nameList = ["One", "Two", "Three", "Four", "Five"]
queueLock = threading.Lock()
workQueue = queue.Queue(10)
threads = []
threadID = 1
# 創(chuàng)建新線(xiàn)程
for tName in threadList:
    thread = myThread(threadID, tName, workQueue)
    thread.start()
    threads.append(thread)
    threadID += 1
# 填充隊(duì)列
queueLock.acquire()
for word in nameList:
    workQueue.put(word)
queueLock.release()
# 等待隊(duì)列清空
while not workQueue.empty():
    pass
# 通知線(xiàn)程是時(shí)候退出
exitFlag = 1
# 等待所有線(xiàn)程完成
for t in threads:
    t.join()
print ("退出主線(xiàn)程")

以上程序執(zhí)行結(jié)果:

開(kāi)啟線(xiàn)程:Thread-1
開(kāi)啟線(xiàn)程:Thread-2
開(kāi)啟線(xiàn)程:Thread-3
Thread-3 processing One
Thread-1 processing Two
Thread-2 processing Three
Thread-3 processing Four
Thread-1 processing Five
退出線(xiàn)程:Thread-3
退出線(xiàn)程:Thread-2
退出線(xiàn)程:Thread-1
退出主線(xiàn)程

上述就是小編為大家分享的如何理解Python3線(xiàn)程優(yōu)先級(jí)隊(duì)列Queue了,如果剛好有類(lèi)似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI