python條件變數之生產者與消費者操作例項分析

2022-09-28 09:42:06 字數 1805 閱讀 4565

互斥鎖是最簡單的執行緒同步機制,面對複雜執行緒同步問題,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的情況下,直接將...