python 多執行緒5執行緒同步

2022-05-31 21:03:12 字數 1851 閱讀 7574

互斥鎖是最簡單的執行緒同步機制,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多執行緒同步

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...