python系統程式設計03-如何保證執行緒之間的同步
阿新 • • 發佈:2021-08-21
-
如何保證執行緒之間的同步
-
若多個執行緒共同對某個資料修改,則可能出現不可預料的結果,為了保證資料的正確性,需要對多個執行緒進行同步。
-
使用thread物件的Lock和Rlock可以實現簡單的執行緒同步,這兩個物件都有acquire方法和release方法,對於那些需要每次只允許一個執行緒操作的資料,可以使用這兩個方法。
-
多執行緒的優勢在於可以同時執行多個任務。但是當執行緒需要共享資料時,可能存在資料不同步的問題。
- 可以考慮這樣一種情況:一個列表裡所有元素都是0,執行緒set從後向前把所有元素改成1,而執行緒print負責從前往後讀取列表並列印。那麼可能出現邊set邊print情況,一半0一半1,這就是資料不同步。為了避免這種情況,引入了鎖的概念。
- 鎖有兩種:鎖定和未鎖定。每當一個執行緒例如set要訪問共享資料時,必須先獲得鎖;如果已經有別的執行緒例如print獲得了鎖,那麼就讓執行緒set暫停,也就是同步阻塞;等到執行緒print訪問完畢,釋放鎖以後,再讓執行緒set繼續。
- 經過這樣的處理,列印列表時要麼全部輸出0,要麼全部輸出1。
import threading import time class myThread(threading.Thread): def __init__(self, threadID, name, counter): threading.Thread.__init__(self) self.threadID= threadID self.name = name self.counter = counter def run(self): print("starting:" + self.name ) threadLock.acquire() print_time(self.name, self.counter, 3) threadLock.release() def print_time(threadName, delay, counter): while counter: time.sleep(delay)print("%s:%s" % (threadName, time.ctime(time.time()))) counter -= 1 threadLock = threading.Lock() threads = [] thread1 = myThread(1, "Thread-1", 1) thread2 = myThread(2, "Thread-2", 2) thread1.start() thread2.start() threads.append(thread1) threads.append(thread2) for t in threads: t.join() print("Exiting Main Thread")