您好,登錄后才能下訂單哦!
小編給大家分享一下Python實現隊列同步的方法是什么,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
隊列
q = Queue.Queue(maxsize = 10) 創建一個“隊列”對象。Queue.Queue類即是一個隊列的同步實現。隊列長度可為無限或者有限。可通過Queue的構造函數的可選參數maxsize來設定隊列長度。如果maxsize小于1就表示隊列長度無限。
q.put()方法在隊尾插入一個項目。put()有兩個參數,第一個item為必需的,為插入項目的值;第二個block為可選參數,默認為1。如果隊列當前為空且block為1,put()方法就使調用線程暫停,直到空出一個數據單元。如果block為0,put方法將引發Full異常。
q.get([block[, timeout]])方法從隊頭刪除并返回一個項目。可選參數為block,默認為True。如果隊列為空且block為True,get()就使調用線程暫停,直至有項目可用。如果隊列為空且block為False,隊列將引發Empty異常,timeout等待時間。
q.qsize() 返回隊列的大小
q.empty() 如果隊列為空,返回True,反之False
q.full() 如果隊列滿了,返回True,反之False
q.full 與 maxsize 大小對應
q.get_nowait() 相當q.get(False)
q.put_nowait(item) 相當q.put(item, False)
q.task_done() 在完成一項工作之后,q.task_done() 函數向任務已經完成的隊列發送一個信號
q.join() 實際上意味著等到隊列為空,再執行別的操作
import queue d = queue.Queue() d.put('1') d.put('2') d.put('3') print(d.get()) print(d.get()) print(d.get()) print(d.get()) print(d.get(0))
運行結果:
1 2 3
報錯:
queue.Empty
線程操作列表是不安全的。
import threading, time li = [1, 2, 3, 4, 5] def pri(): while li: a = li [-1] print(a) time.sleep(1) try: li.remove(a) except: print('-----', a) t1 = threading.Thread(target=pri, args=()) t1.start() t2 = threading.Thread(target=pri, args=()) t2.start()
運行結果:
5 5 4 ----- 5 4 3 ----- 4 3 2 ----- 3 2 1 ----- 2 1 ----- 1
import threading, queue from time import sleep from random import randint class Production(threading.Thread): def run(self): while True: r = randint(0, 100) q.put(r) print("生產出來 %s 號包子" %r) sleep(1) class Proces(threading.Thread): def run(self): while True: re = q.get() print('吃掉 %s號包子' %re) if __name__ == '__main__': q = queue.Queue(10) threads = [Production(),Production(),Production(),Proces()] for t in threads: t.start()
運行結果:
生產出來 94 號包子 生產出來 13 號包子 生產出來 79 號包子 吃掉 94號包子 吃掉 13號包子 吃掉 79號包子 生產出來 43 號包子 吃掉 43號包子 生產出來 32 號包子 吃掉 32號包子 ......
看完了這篇文章,相信你對Python實現隊列同步的方法是什么有了一定的了解,想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。