互斥鎖是最簡單的執行緒同步機制,面對複雜執行緒同步問題,python還提供了condition物件。condition被稱為條件變數,除了提供與lock類似的acquire和release方法外,還提供了wait和notify方法。執行緒首先acquire乙個條件變數,然後判斷一些條件。如果條件不滿足則wait;如果條件滿足,進行一些處理改變條件後,通過notify方法通知其他執行緒,其他處於wait狀態的執行緒接到通知後會重新判斷條件。不斷的重複這一過程,從而解決複雜的同步問題。
可以認為condition物件維護了乙個鎖(lock/rlock)和乙個waiting池。執行緒通過acquire獲得condition物件,當呼叫wait方法時,執行緒會釋放condition內部的鎖並進入blocked狀態,(但實際上不會block當前執行緒)同時在waiting池中記錄這個執行緒。當呼叫notify方法時,condition物件會從waiting池中挑選乙個執行緒,通知其呼叫acquire方法嘗試取到鎖。
condition物件的建構函式可以接受乙個lock/rlock物件作為引數,如果沒有指定,則condition物件會在內部自行建立乙個rlock。
執行緒同步經典問題----生產者與消費者問題可以使用條件變數輕鬆解決。
import threading
import time
class producer(threading.thread):
scftzdef __init__(self):
threading.thread.__init__(self)
def run(self):
global count
while true:
con.acquire()
if count <20:
count += 1
print self.name," producer product 1,current is %d" %(count)
con.notify()
else:
print self.name,"producer say box is full"
con.wait()
con.release()
time.sleep(1)
class consumer(threading.thread):
def __init__(self):
threading.thread.__init__(self)
def run(self):
global count
while true:
con.acquire()
if count>4:
count -=4
print self.name,"consumer consume 4,current is %d" %(count)
con.notify()
else:
con.wait()
print self.name," consume程式設計客棧r say box is empty"
con.release()
time.sleep(1)
count = 0
con = threading.condition()
def test():
for i in range(1):
a = consumer()
a.start()
for i in range(1):
b =producer()
b.start()
if __name__程式設計客棧=='__ma程式設計客棧inscftz__':
test()
上面的**假定消費者消費的比較快,輸出結果為:
生產者與消費者模型 及 條件變數
生產者與消費者問題 及 條件變數 什麼是生產者和消費者模型生產者,顧名思義就是生產東西的人,而消費者就消費的人。在系統中,假設有一塊記憶體,生產者要向記憶體中放資料,而消費者要從記憶體區域中拿資料。這片記憶體區域可以被所有的執行緒訪問,所以這片記憶體區域就是臨界資源,而在對臨界區的訪問時,要保證不會...
條件變數和生產者消費模式
include include include includeint ready 0 pthread mutex t mutex pthread cond t has product void producer void arg 消費者 void consumer void arg 有產品,消費產品...
Kafka之生產者
1 方便在集群中擴充套件,乙個topic可以有多個partition組成,而每個partition可以通過調整以適應它所在的機器 2 可以提高併發,因為可以以partition為單位讀寫 我們需要將生產者傳送的資料封裝成乙個producerrecord物件。1 指明partition的情況下,直接將...