~~並發編程(十四):Queue~~


進擊の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')

*****
*****


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM