摘要:實例使用隊列一般可以簡化多線程的程序。實際開發中,此處應該使用有用的工作代替完成,指示收到和返回哨兵好帥運行結果好帥多線程按順序執行直接看實例吧,控制多線程的執行順序代碼控制多線程的執行順序創建實例,第一個開始不上鎖結果
上一篇文章:Python線程專題9:線程終止與掛起、實用工具函數
下一篇文章:敬請期待
queue模塊實現了各種【多生產者-多消費者】隊列。可用于在執行的多個線程之間安全的交換信息。3種不同的隊列類queue模塊定義了3種不同的隊列類。
q=Queue(maxsize):創建一個FIFO(first-in first-out,先進先出)隊列。maxsize是隊列中金額以放入的項的最大數量。 如果省略maxsize參數或將它置為0,隊列大小將無窮大。 q=LifoQueue(maxsize):創建一個LIFO(last-in first-out,后進先出)隊列(棧)。 q=PriorityQueue(maxsize):創建一個優先級隊列,其中項按照優先級從低到高依次排好。 使用這種隊列時,項應該是(priority,data)形式的元組,其中priority時一個標識優先級的數字。常用方法
q.size():返回隊列的正確大小。因為其他線程可能正在更新此隊列,所以此方法的返回數字不可靠。 q.empty():如果隊列為空,返回True,否則返回False。 q.full():如果隊列已滿,返回True,否則返回False。 q.put(item,block,timeout):將item放入隊列。 如果block設為True(默認值),調用者將被阻塞直到隊列中出現可用的空閑位置為止。 如果block設為False,隊列滿時此方法將引發Full異常。 q.put_nowait(item):等價于q.put(item,False) q.get(block,timeout):從隊列中刪除一項,然后返回這個項。 如果block設為True(默認值),調用者將阻塞,直到隊列中出現可用的空閑為止。 如果block設為False,隊列為空時將引發Empty異常。 timeout提供可選的超時值,單位為秒,如果超時,將引發Empty異常。 q.get_nowait():等價于get(0) q.task_done():在隊列種數據的消費者用來指示對于項的處理已經結束。如果使用此方法,那么從隊列中刪除的每一項都應該調用一次。 q.join():阻塞直到隊列中的所有項均被刪除和處理為止。一旦為隊列中的每一項都調用了一次q.task_done()方法,此方法將會直接返回。
實例:
使用 隊列一般可以簡化多線程的程序。例如,可以使用共享隊列將線程連接在一起,而不必依賴鎖的保護。在這種模型下,工作者線程一般充當數據的消費者。
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 #實際開發中,此處應該使用有用的工作代替 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()
運行結果:
Mark 好 TM 帥多線程按順序執行
直接看實例吧,控制多線程的執行順序:
代碼:
#控制多線程的執行順序 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() #創建lock實例1,第一個開始不上鎖 lock1=Lock() lock2=Lock() lock2.acquire() lock3=Lock() lock3.acquire() t1=Task1() t2=Task2() t3=Task3() t1.start() t2.start() t3.start()
結果:
---Task1--- ---Task2--- ---Task3--- ---Task1--- ---Task2--- ---Task3--- ---Task1--- ---Task2--- ---Task3--- ---Task1--- ---Task2--- ---Task3--- ...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/42415.html
摘要:上一篇文章線程專題使用鎖的注意事項下一篇文章線程專題多線程按順序執行線程沒有任何方法可用于強制終止或掛起。實用工具函數函數名解釋返回當前活動的對象數量。 上一篇文章:Python線程專題8:使用鎖的注意事項下一篇文章:Python線程專題10:queue、多線程按順序執行 線程沒有任何方法可用于強制終止或掛起。這是設計上的原因,因為編寫線程程序本身十分復雜。例如:如果某個線程已經獲取...
摘要:上一篇文章進程專題完結篇多進程處理的一般建議下一篇文章線程專題多線程使用的必要性進程線程進程能夠完成多任務,比如在一個電腦上可以運行多個軟件。由于占用資源少,也使得多線程程序并發比較高。 上一篇文章:Python進程專題完結篇:多進程處理的一般建議下一篇文章:Python線程專題1:多線程使用的必要性 進程VS線程 進程:能夠完成多任務,比如在一個電腦上可以運行多個軟件。線程:也能夠...
摘要:上一篇文章線程專題縱覽篇下一篇文章線程專題多線程共享全局變量在引入多線程之前,我們先來看一個非常簡單的實例。實例單線程實例的帥,遠近聞名第次傳播暫停一秒,不然看不到效果哦結果按照順序依次打印上面是單線程顯示效果,現在我們來用多線程處理一下。 上一篇文章:Python線程專題縱覽篇下一篇文章:Python線程專題2:多線程共享全局變量 在引入多線程之前,我們先來看一個非常簡單的實例。 ...
摘要:語法創建定時器對象,在秒后運行函數,和提供傳遞給的參數和關鍵字參數。在調用方法后才能啟動計定時器。如果函數還未執行,取消定時器。否則,鎖將保持已鎖定狀態。 上一篇文章:Python線程專題3:thread對象下一篇文章:Python線程專題5:信號量與有邊界的信號量 Timer對象、Lock對象、Rlock對象 Timer對象 Timer對象用于在稍后的某個時間執行一個函數。 語法:...
閱讀 2369·2021-11-11 16:54
閱讀 2617·2021-09-26 09:47
閱讀 3989·2021-09-08 09:36
閱讀 2739·2021-07-25 21:37
閱讀 932·2019-08-30 15:54
閱讀 2544·2019-08-30 14:22
閱讀 3254·2019-08-30 13:57
閱讀 2589·2019-08-29 17:17