python 的多執行緒以及鎖定
阿新 • • 發佈:2019-02-02
下面的程式碼主要是使用一個類對外部資料(myList)進行修改,由於兩個執行緒同時對myList修改,在不加鎖的情況下,可能導致資料被不安全修改。
讀者可嘗試將“開啟鎖”和“釋放鎖”註釋,重執行,看效果。
#!/usr/local/bin/python
# coding: utf-8
import threading
import time
class ChangeVal(threading.Thread):
# 繼承threading.Thread並初始化,相當於建構函式
def __init__(self, myList, changeType, threadLock):
threading.Thread.__init__(self)
# self.myList 會指向外部傳入的myList的同一個實體地址。相當於傳入了C++的引用型別。
self.myList = myList
self.changeType = changeType
self.threadLock = threadLock
# 重寫run
def run(self):
# 開啟鎖
self.threadLock.acquire()
if self.changeType:
self.change1()
else:
self.change2()
# 釋放鎖
self.threadLock.release()
# 將myList資料全部改為1
def change1(self):
for i in range(len(self.myList)):
time.sleep(1)
self.myList[i] = 1
print "in change1:" + str(self.myList)
# 將myList資料全部改為2
def change2(self):
for i in range(len(self.myList)):
time.sleep(1)
self.myList[i] = 2
print "in change2:" + str(self.myList)
if __name__ == "__main__":
# 初始化用於給多個執行緒操作的資料
myList = [0 for i in range(10)]
# 初始化鎖的物件
threadLock = threading.Lock()
thread1 = ChangeVal(myList, True, threadLock)
thread2 = ChangeVal(myList, False, threadLock)
threads = [thread1, thread2]
print "origin is:" + str(myList)
thread1.start()
thread2.start()
# 等待所有執行緒結束
for t in threads:
t.join()
print "all threads exit"