進擊のpython
並發編程——Queue
進程其實就提過這個Queue的問題,我們為什么在進程使用Queue?
是因為當時我們想要對共享數據進行修改,同時也希望它能夠自動的給我加個鎖
基於上面的需求Queue就應運而生,扛起了這桿大旗
那反觀線程這里,數據是共享的,那為什么還要使用Queue呢?
其實線程用Queue也是看上了他能夠自己加鎖的這個能力,防止自己加鎖,出現死鎖
單拿出來不是為了划水,而是因為Queue還有一些其他的方法沒有介紹到
所以准備重新的再仔細地最后介紹一遍
隊列
隊列就像是商場里面的自動扶梯,先上扶梯的,也是第一個下去的
所以隊列遵循着“先進先出”原則,即:FIFO
import queue
q = queue.Queue()
q.put('first')
q.put('second')
q.put('third')
print(q.get())
print(q.get())
print(q.get())
輸出結果:
first
second
third
其中如果q = queue.Queue()
中括號內填有數字,代表着管道的容積可以最多容納的單元
如果是這樣q = queue.Queue(3)
,就說明管道中最多容納三個單位
當我put四次,由於沒有從管道中取值,就會引發阻塞
相對應的,如果我get了四次,由於值都已經取完 ,所以也會發生阻塞
其實阻塞是因為Queue中有個默認參數block=True
他的意思就是是否發生阻塞,如果改成False,當‘放多了’或者‘拿多了’,就會報錯
里面還有一個默認參數timeout=None
是多長時間改變block的狀態
q.get(block = True, timeout = 1)
比如此時這個get是第四次get,那就是,現在是阻塞狀態,如果1s之內沒有值讓我get我就報錯
堆棧
queue.LifoQueue 堆棧遵循“后進先出”
import queue
q = queue.LifoQueue(3)
q.put('first')
q.put('second')
q.put('third')
print(q.get())
print(q.get())
print(q.get())
執行結果如下:
third
second
first
有一句話說得好,隊列是“吃了拉”,堆棧是“吃了吐”
優先級隊列
queue.PriorityQueue 根據優先級決定
import queue
q=queue.PriorityQueue()
q.put((20,'a'))
q.put((10,'b'))
q.put((30,'c'))
print(q.get())
print(q.get())
print(q.get())
put放進去一個元組,元組的第一個元素是優先級(通常是數字,也可以是非數字之間的比較)
數字越小優先級越高!
執行結果如下:
(10, 'b')
(20, 'a')
(30, 'c')