queue是python中的標(biāo)準(zhǔn)庫(kù),俗稱(chēng)隊(duì)列,可以直接import 引用,在python2.x中,模塊名為Queue
在python中,多個(gè)線(xiàn)程之間的數(shù)據(jù)是共享的,多個(gè)線(xiàn)程進(jìn)行數(shù)據(jù)交換的時(shí)候,不能夠保證數(shù)據(jù)的安全性和一致性,所以當(dāng)多個(gè)線(xiàn)程需要進(jìn)行數(shù)據(jù)交換的時(shí)候,隊(duì)列就出現(xiàn)了,隊(duì)列可以完美解決線(xiàn)程間的數(shù)據(jù)交換,保證線(xiàn)程間數(shù)據(jù)的安全性和一致性
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í)行別的操作
import threading import time def a(): print("a start\n") for i in range(10): time.sleep(0.1) print("a finish\n") def b(): print("b start\n") print("b finish\n") def main(): # t=threading.Thread(target=a,name="T") t = threading.Thread(target=a) t2=threading.Thread(target=b) t.start() t2.start() # t2.join() # t.join() print("all done\n") if __name__ == '__main__': main()
Queue 模塊:
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)程")
到此這篇關(guān)于Python多線(xiàn)程 Queue 模塊的文章就介紹到這了,更多相關(guān)Python Queue 模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
標(biāo)簽:珠海 宜昌 上饒 潮州 湖北 西寧 佳木斯 盤(pán)錦
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Python多線(xiàn)程 Queue 模塊常見(jiàn)用法》,本文關(guān)鍵詞 Python,多,線(xiàn)程,Queue,模塊,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。