摘要:實(shí)例使用隊(duì)列一般可以簡化多線程的程序。實(shí)際開發(fā)中,此處應(yīng)該使用有用的工作代替完成,指示收到和返回哨兵好帥運(yùn)行結(jié)果好帥多線程按順序執(zhí)行直接看實(shí)例吧,控制多線程的執(zhí)行順序代碼控制多線程的執(zhí)行順序創(chuàng)建實(shí)例,第一個(gè)開始不上鎖結(jié)果
上一篇文章:Python線程專題9:線程終止與掛起、實(shí)用工具函數(shù)
下一篇文章:敬請期待
queue模塊實(shí)現(xiàn)了各種【多生產(chǎn)者-多消費(fèi)者】隊(duì)列??捎糜谠趫?zhí)行的多個(gè)線程之間安全的交換信息。3種不同的隊(duì)列類queue模塊定義了3種不同的隊(duì)列類。
q=Queue(maxsize):創(chuàng)建一個(gè)FIFO(first-in first-out,先進(jìn)先出)隊(duì)列。maxsize是隊(duì)列中金額以放入的項(xiàng)的最大數(shù)量。 如果省略maxsize參數(shù)或?qū)⑺脼?,隊(duì)列大小將無窮大。 q=LifoQueue(maxsize):創(chuàng)建一個(gè)LIFO(last-in first-out,后進(jìn)先出)隊(duì)列(棧)。 q=PriorityQueue(maxsize):創(chuàng)建一個(gè)優(yōu)先級隊(duì)列,其中項(xiàng)按照優(yōu)先級從低到高依次排好。 使用這種隊(duì)列時(shí),項(xiàng)應(yīng)該是(priority,data)形式的元組,其中priority時(shí)一個(gè)標(biāo)識優(yōu)先級的數(shù)字。常用方法
q.size():返回隊(duì)列的正確大小。因?yàn)槠渌€程可能正在更新此隊(duì)列,所以此方法的返回?cái)?shù)字不可靠。 q.empty():如果隊(duì)列為空,返回True,否則返回False。 q.full():如果隊(duì)列已滿,返回True,否則返回False。 q.put(item,block,timeout):將item放入隊(duì)列。 如果block設(shè)為True(默認(rèn)值),調(diào)用者將被阻塞直到隊(duì)列中出現(xiàn)可用的空閑位置為止。 如果block設(shè)為False,隊(duì)列滿時(shí)此方法將引發(fā)Full異常。 q.put_nowait(item):等價(jià)于q.put(item,False) q.get(block,timeout):從隊(duì)列中刪除一項(xiàng),然后返回這個(gè)項(xiàng)。 如果block設(shè)為True(默認(rèn)值),調(diào)用者將阻塞,直到隊(duì)列中出現(xiàn)可用的空閑為止。 如果block設(shè)為False,隊(duì)列為空時(shí)將引發(fā)Empty異常。 timeout提供可選的超時(shí)值,單位為秒,如果超時(shí),將引發(fā)Empty異常。 q.get_nowait():等價(jià)于get(0) q.task_done():在隊(duì)列種數(shù)據(jù)的消費(fèi)者用來指示對于項(xiàng)的處理已經(jīng)結(jié)束。如果使用此方法,那么從隊(duì)列中刪除的每一項(xiàng)都應(yīng)該調(diào)用一次。 q.join():阻塞直到隊(duì)列中的所有項(xiàng)均被刪除和處理為止。一旦為隊(duì)列中的每一項(xiàng)都調(diào)用了一次q.task_done()方法,此方法將會直接返回。
實(shí)例:
使用 隊(duì)列一般可以簡化多線程的程序。例如,可以使用共享隊(duì)列將線程連接在一起,而不必依賴鎖的保護(hù)。在這種模型下,工作者線程一般充當(dāng)數(shù)據(jù)的消費(fèi)者。
from threading import Thread from queue import Queue class WorkerThread(Thread): def __init__(self,*args,**kwargs): Thread.__init__(self,*args,**kwargs) self.input_queue=Queue() def send(self,item): self.input_queue.put(item) def close(self): self.input_queue.put(None) self.input_queue.join() def run(self): while True: item=self.input_queue.get() if item is None: break #實(shí)際開發(fā)中,此處應(yīng)該使用有用的工作代替 print(item) self.input_queue.task_done() #完成,指示收到和返回哨兵 self.input_queue.task_done() return if __name__=="__main__": w=WorkerThread() w.start() w.send("Mark") w.send("好") w.send("TM") w.send("帥") w.close()
運(yùn)行結(jié)果:
Mark 好 TM 帥多線程按順序執(zhí)行
直接看實(shí)例吧,控制多線程的執(zhí)行順序:
代碼:
#控制多線程的執(zhí)行順序 from threading import Thread,Lock import time class Task1(Thread): def run(self): while True: if lock1.acquire(): print("---Task1---") time.sleep(0.5) lock2.release() class Task2(Thread): def run(self): while True: if lock2.acquire(): print("---Task2---") time.sleep(0.5) lock3.release() class Task3(Thread): def run(self): while True: if lock3.acquire(): print("---Task3---") time.sleep(0.5) lock1.release() #創(chuàng)建lock實(shí)例1,第一個(gè)開始不上鎖 lock1=Lock() lock2=Lock() lock2.acquire() lock3=Lock() lock3.acquire() t1=Task1() t2=Task2() t3=Task3() t1.start() t2.start() t3.start()
結(jié)果:
---Task1--- ---Task2--- ---Task3--- ---Task1--- ---Task2--- ---Task3--- ---Task1--- ---Task2--- ---Task3--- ---Task1--- ---Task2--- ---Task3--- ...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/42415.html
摘要:上一篇文章線程專題使用鎖的注意事項(xiàng)下一篇文章線程專題多線程按順序執(zhí)行線程沒有任何方法可用于強(qiáng)制終止或掛起。實(shí)用工具函數(shù)函數(shù)名解釋返回當(dāng)前活動(dòng)的對象數(shù)量。 上一篇文章:Python線程專題8:使用鎖的注意事項(xiàng)下一篇文章:Python線程專題10:queue、多線程按順序執(zhí)行 線程沒有任何方法可用于強(qiáng)制終止或掛起。這是設(shè)計(jì)上的原因,因?yàn)榫帉懢€程程序本身十分復(fù)雜。例如:如果某個(gè)線程已經(jīng)獲取...
摘要:上一篇文章進(jìn)程專題完結(jié)篇多進(jìn)程處理的一般建議下一篇文章線程專題多線程使用的必要性進(jìn)程線程進(jìn)程能夠完成多任務(wù),比如在一個(gè)電腦上可以運(yùn)行多個(gè)軟件。由于占用資源少,也使得多線程程序并發(fā)比較高。 上一篇文章:Python進(jìn)程專題完結(jié)篇:多進(jìn)程處理的一般建議下一篇文章:Python線程專題1:多線程使用的必要性 進(jìn)程VS線程 進(jìn)程:能夠完成多任務(wù),比如在一個(gè)電腦上可以運(yùn)行多個(gè)軟件。線程:也能夠...
摘要:上一篇文章線程專題縱覽篇下一篇文章線程專題多線程共享全局變量在引入多線程之前,我們先來看一個(gè)非常簡單的實(shí)例。實(shí)例單線程實(shí)例的帥,遠(yuǎn)近聞名第次傳播暫停一秒,不然看不到效果哦結(jié)果按照順序依次打印上面是單線程顯示效果,現(xiàn)在我們來用多線程處理一下。 上一篇文章:Python線程專題縱覽篇下一篇文章:Python線程專題2:多線程共享全局變量 在引入多線程之前,我們先來看一個(gè)非常簡單的實(shí)例。 ...
摘要:語法創(chuàng)建定時(shí)器對象,在秒后運(yùn)行函數(shù),和提供傳遞給的參數(shù)和關(guān)鍵字參數(shù)。在調(diào)用方法后才能啟動(dòng)計(jì)定時(shí)器。如果函數(shù)還未執(zhí)行,取消定時(shí)器。否則,鎖將保持已鎖定狀態(tài)。 上一篇文章:Python線程專題3:thread對象下一篇文章:Python線程專題5:信號量與有邊界的信號量 Timer對象、Lock對象、Rlock對象 Timer對象 Timer對象用于在稍后的某個(gè)時(shí)間執(zhí)行一個(gè)函數(shù)。 語法:...
閱讀 2379·2021-11-11 16:54
閱讀 2631·2021-09-26 09:47
閱讀 3992·2021-09-08 09:36
閱讀 2742·2021-07-25 21:37
閱讀 934·2019-08-30 15:54
閱讀 2547·2019-08-30 14:22
閱讀 3256·2019-08-30 13:57
閱讀 2607·2019-08-29 17:17