互斥鎖是最簡單的執行緒同步機制,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 threadingimport 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多執行緒同步
1 實現檔案讀寫的檔案ltz schedule times.py usr bin env python coding utf 8 import os def readtimes res if os.path.exists schedule times.txt fp open schedule tim...
Python 多執行緒3 同步執行緒
現在假設這樣乙個例子 有乙個全域性的計數num,每個執行緒獲取這個全域性的計數,根據num進行一些處理,然後將num加1。很容易寫出這樣的 encoding utf 8 import threading import time class mythread threading.thread def ...
Python 多執行緒簡單案例 執行緒同步
codeing utf 8 import time import threading 執行緒同步 class mythead threading.thread def init self,name,delay threading.thread.init self self.name name sel...