1. 程式人生 > >python多執行緒及互斥鎖使用

python多執行緒及互斥鎖使用

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的解鎖再繼續執行