Python實現執行緒安全佇列

果金資料發表於2019-02-28

   最近學習spark,我主要使用pyspark api進行程式設計。

之前使用Python都是現學現用,用完就忘了也沒有理解和記憶,因此這裡把Python相關的知識也彌補和記錄下來吧

多執行緒任務佇列在實際專案中非常有用,關鍵的地方要實現佇列的多執行緒同步問題,也即保證佇列的多執行緒安全

例如:可以開多個消費者執行緒,每個執行緒上繫結一個佇列,這樣就實現了多個消費者同時處理不同佇列上的任務

同時可以有多個生產者往佇列傳送訊息,實現非同步訊息處理

先複習下互斥量條件變數的概念:

互斥量(mutex)從本質上說是一把鎖,在訪問共享資源前對互斥量進行加鎖,在訪問完成後釋放互斥量上的鎖。對互斥量進行加鎖以後,任何其他試圖再次對互斥鎖加鎖的執行緒將會阻塞直到當前執行緒釋放該互斥鎖。如果釋放互斥鎖時有多個執行緒阻塞,所有在該互斥鎖上的阻塞執行緒都會變成可執行狀態,第一個變為執行狀態的執行緒可以對互斥鎖加鎖,其他執行緒將會看到互斥鎖依然被鎖住,只能回去再次等待它重新變為可用。

條件變數(cond)是在多執行緒程式中用來實現”等待–》喚醒”邏輯常用的方法。條件變數利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作:一個執行緒等待”條件變數的條件成立”而掛起;另一個執行緒使“條件成立”。為了防止競爭,條件變數的使用總是和一個互斥鎖結合在一起。執行緒在改變條件狀態前必須首先鎖住互斥量,函式pthread_cond_wait把自己放到等待條件的執行緒列表上,然後對互斥鎖解鎖(這兩個操作是原子操作)。在函式返回時,互斥量再次被鎖住

條件變數總是與互斥鎖一起使用的

Python的threading中定義了兩種鎖:threading.Lock和threading.RLock

兩者的不同在於後者是可重入鎖,也就是說在一個執行緒內重複LOCK同一個鎖不會發生死鎖,這與POSIX中的PTHREAD_MUTEX_RECURSIVE也就是可遞迴鎖的概念是相同的, 互斥鎖的API有三個函式,分別執行分配鎖,上鎖,解鎖操作。

Python實現執行緒安全佇列

python的threading中的條件變數預設繫結了一個RLock,也可以在初始化條件變數的時候傳進去一個自己定義的鎖.

Python實現執行緒安全佇列

最後貼出我自己實現的簡單執行緒安全任務佇列

Python實現執行緒安全佇列

測試程式碼

Python實現執行緒安全佇列



相關文章