python多執行緒及互斥鎖使用
阿新 • • 發佈:2018-12-23
def RunThread(target, *args): #傳入一個函式多執行緒執行
print u"啟動執行緒:", target.__name__
t = threading.Thread(target = target, args = args)
#t.setDaemon(True) #設定為守護執行緒 當主程序結束後所有子執行緒都會結束
t.start()
def fun1(): #每3秒輸出一次fun1 總共輸出5次
for i in range(5):
print "fun1"
time.sleep( 3)
def fun2(count, sleep): #每sleep輸出一次fun2 總共輸出count次
for i in range(count):
print "fun2"
time.sleep(sleep)
RunThread(fun1) #建立一個執行緒執行fun1函式
RunThread(fun2, 5, 1) #建立一個執行緒執行fun2函式並給fun2函式傳參5和1
print "end!"
'''
輸出
啟動執行緒: fun1
fun1啟動執行緒:
fun2
fun2end!
fun2
fun2
fun1
fun2
fun2
fun1
fun1
fun1
'''
使用threading模組建立多執行緒
x = 0
def fun1():
global x
for i in range(1000):
x = x + 1
def fun2():
global x
for i in range(1000):
x = x + 1
t = threading.Thread(target = fun1)
t.start()
t = threading.Thread(target = fun2)
t.start()
time.sleep(3) #3秒足夠讓兩個執行緒執行完畢
print x
#輸出1603 和預計不符
多執行緒修改同一個全域性變量出現問題
lock = threading.Lock()
x = 0
def fun1():
global lock, x
for i in range(1000):
lock.acquire() #加鎖
x = x + 1
lock.release() #解鎖
def fun2():
global lock, x
for i in range(1000):
lock.acquire()
x = x + 1
lock.release()
t = threading.Thread(target = fun1)
t.start()
t = threading.Thread(target = fun2)
t.start()
time.sleep(3) #3秒足夠讓兩個執行緒執行完畢
print x
#使用互斥鎖 輸出正確結果2000
使用互斥鎖保證資料正確
lock = threading.Lock()
def RunThread(target, *args): #傳入一個函式多執行緒執行
print u"啟動執行緒:", target.__name__
t = threading.Thread(target = target, args = args)
#t.setDaemon(True) #設定為守護執行緒 當主程序結束後所有子執行緒都會結束
t.start()
def fun():
global lock
lock.acquire()
print "lock"
time.sleep(2)
lock.release()
print "unlock"
RunThread(fun)
RunThread(fun)
for i in range(5):
time.sleep(1)
print "" #輸出換行
'''
輸出
啟動執行緒: fun
啟動執行緒:lock
fun
nlocklock
nlock
'''
當執行緒使用acquire嘗試鎖定lock時發現已經被鎖定則進入阻塞狀態 等待lock的解鎖再繼續執行