同步佇列 Queue模組解析

2022-05-20 22:04:37 字數 1928 閱讀 8372

queue模組解決了生產者、消費者問題,在多執行緒程式設計中進行執行緒通訊的時候尤其有用,queue類封裝了加鎖解鎖的過程。

在queue模組中有三種不同的佇列類,區別是不同佇列取出資料的順序不同。在fifo佇列中,先存進去的資料最先取出來。而在lifo佇列中,最後存進去的資料最取出來。在加權佇列中,權值最小的先取出來。

queue(maxsize=0)類

構造乙個先進先出fifo的佇列,maxsize是個整數,指定了佇列中最多能夠存入的資料個數,如果達到最大數目,將不能再進行插入操作,如果maxsize小於等於0,則對插入的數目沒有限制。

lifequeue(maxsize)類

構造乙個後進先出lifo的佇列。其他跟queue類一樣。

priorityqueue(maxsize)類

加權佇列,權值最小的值最先取出。插入的資料格式應該為(priority_number, data)

此外,queue模組還定義了兩個異常類。

empty

當隊列為空卻執行get()操作時,將丟擲這個異常。

full

當佇列滿了,卻執行put()操作時將丟擲這個異常。

注意:collections模組中的deque是不帶加鎖解鎖功能的。

queue物件定義了以下公共方法。

qsize():返回佇列的大小。

empty():判斷佇列是否為空。

full():判斷佇列是否滿了。

put(item[,block[,timeout]]):插入元素到佇列,如果可選引數block為true,並且timeout為none(預設值),將等待佇列中有空閒位置,如果timetout為乙個正整數,將最多等待timeout秒,然後丟擲full異常。如果block為false,在佇列中有空餘位置時直接執行插入操作,如果沒有則丟擲異常。

put_nowait(item):相當於put(item,false)

get([block[,timeout]]):從佇列中取出乙個元素,如果可選引數block為true,並起timeout為none,如果隊列為空將等待直到佇列中不為空,如果timeout為乙個正整數,則只會等待最多timeout秒,然後丟擲empty異常。如果block為false,如果佇列非空將直接返回元素,如果為空則丟擲異常。

get_nowait():相當於get(false)

join():等待佇列中所有的元素被取出並執行。

task_done():當前乙個從佇列中取出的任務執行完畢之後,通過這個方法告訴佇列操作已經執行完畢。

例如下面的例子:

1

defworker():

2while

true:

3 item =q.get()

4do_work(item)

5q.task_done()

67 q =queue()

8for i in

range(num_worker_threads):

9 t = thread(target=worker)

10 t.daemon =true

11t.start()

1213

for item in

source():

14q.put(item)

1516 q.join() #

block until all tasks are done

CLH同步佇列

aqs內部維護著乙個fifo佇列,該佇列就是clh同步佇列。clh同步佇列是乙個fifo雙向佇列,aqs依賴它來完成同步狀態的管理,當前執行緒如果獲取同步狀態失敗時,aqs則會將當前執行緒已經等待狀態等資訊構造成乙個節點 node 並將其加入到clh同步佇列,同時會阻塞當前執行緒,當同步狀態釋放時,...

執行緒程式設計 同步佇列

我們經常會採用生產者 消費者關係的兩個執行緒來處理乙個共享緩衝區的資料。例如一 個生產者執行緒接受使用者資料放入乙個共享緩衝區裡,等待乙個消費者執行緒對資料取出處理。但是如果緩衝區的太小而生產者和消費者兩個非同步執行緒的速度不同時,容 易出現乙個執行緒等待另乙個情況。為了盡可能的縮短共享資源並以相同...

(原創)C 同步佇列

同步佇列作為乙個執行緒安全的資料共享區,經常用於執行緒之間資料讀取,比如半同步半非同步執行緒池的同步佇列。其實做起來比較簡單,要用到list 鎖和條件變數,條件變數的作用是在佇列滿了或者空了的時候等待通知。先看乙個簡單的同步佇列 include include include include inc...