python多執行緒程式設計 5 條件變數同步

2021-06-06 01:03:49 字數 1864 閱讀 4713

互斥鎖是最簡單的執行緒同步機制,python提供的condition物件提供了對複雜執行緒同步問題的支援。condition被稱為條件變數,除了提供與lock類似的acquire和release方法外,還提供了wait和notify方法。執行緒首先acquire乙個條件變數,然後判斷一些條件。如果條件不滿足則wait;如果條件滿足,進行一些處理改變條件後,通過notify方法通知其他執行緒,其他處於wait狀態的執行緒接到通知後會重新判斷條件。不斷的重複這一過程,從而解決複雜的同步問題。

可以認為condition物件維護了乙個鎖(lock/rlock)和乙個waiting池。執行緒通過acquire獲得condition物件,當呼叫wait方法時,執行緒會釋放condition內部的鎖並進入blocked狀態,同時在waiting池中記錄這個執行緒。當呼叫notify方法時,condition物件會從waiting池中挑選乙個執行緒,通知其呼叫acquire方法嘗試取到鎖。

condition物件的建構函式可以接受乙個lock/rlock物件作為引數,如果沒有指定,則condition物件會在內部自行建立乙個rlock。

除了notify方法外,condition物件還提供了notifyall方法,可以通知waiting池中的所有執行緒嘗試acquire內部鎖。由於上述機制,處於waiting狀態的執行緒只能通過notify方法喚醒,所以notifyall的作用在於防止有執行緒永遠處於沉默狀態。

演示條件變數同步的經典問題是生產者與消費者問題:假設有一群生產者(producer)和一群消費者(consumer)通過乙個市場來互動產品。生產者的」策略「是如果市場上剩餘的產品少於1000個,那麼就生產100個產品放到市場上;而消費者的」策略「是如果市場上剩餘產品的數量多餘100個,那麼就消費3個產品。用condition解決生產者與消費者問題的**如下:

import threading

import time

class producer(threading.thread):

def run(self):

global count

while true:

if con.acquire():

if count > 1000:

con.wait()

else:

count = count+100

msg = self.name+' produce 100, count=' + str(count)

print msg

con.notify()

con.release()

time.sleep(1)

class consumer(threading.thread):

def run(self):

global count

while true:

if con.acquire():

if count < 100:

con.wait()

else:

count = count-3

msg = self.name+' consume 3, count='+str(count)

print msg

con.notify()

con.release()

time.sleep(1)

count = 500

con = threading.condition()

def test():

for i in range(2):

p = producer()

p.start()

for i in range(5):

c = consumer()

c.start()

if __name__ == '__main__':

test()

python核心程式設計5 條件控制語句

塊if 條件表示式 塊else 塊value 30000 if value 30000 print 有錢任性 elif value 20000 print 有錢真好 elif value 10000 print 哥也月薪上萬了 elif value 5000 print 工資還說的過去 elif v...

Linux多執行緒 九 條件變數

1 名稱 pthread cond init 目標 條件變數初始化 標頭檔案 include pthread.h 函式原形 int pthread cond init pthread cond t cond,const pthread condattr t attr 引數 cptr 條件變數 att...

python認識 5 條件判斷

計算機之所以能做很多自動化的任務,因為它可以自己做條件判斷。if 條件判斷1 執行1 elif 條件判斷2 執行2 elif 條件判斷3 執行3 else 執行4 注 意else後不要少寫了冒號 if語句執行有個特點,它是從上往下判斷,如果在某個判斷上是true,把該判斷對應的語句執行後,就忽略掉剩...