1. 程式人生 > >python 的多執行緒以及鎖定

python 的多執行緒以及鎖定

下面的程式碼主要是使用一個類對外部資料(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"