不使用 lock 的情況
函式一:全域性變數a的值每次加1,迴圈10次,並列印
def
job1
():global a
for i in range(10):
a+=1
print('job1',a)
函式二:全域性變數a的值每次加10,迴圈10次,並列印
def
job2
():global a
for i in range(10):
a+=10
print('job2',a)
主函式:定義兩個執行緒,分別執行函式一和函式二
if __name__==
'__main__':
a=0 t1=threading.
thread(target=job1)
t2=threading.
thread(target=job2)
t1.start()
t2.start()
t1.join()
t2.join()
完整**:
import threading
defjob1
():global a
for i in range(10):
a+=1
print('job1',a)
defjob2
():global a
for i in range(10):
a+=10
print('job2',a)
if __name__== '__main__':
lock=threading.lock()
a=0t1=threading.thread(target=job1)
t2=threading.thread(target=job2)
t1.start()
t2.start()
t1.join()
t2.join()
執行結果(在spyder編譯器下執行的列印結果):
job1job2 11
job2 21
job2 31
job2 41
job2 51
job2 61
job2 71
job2 81
job2 91
job2 101
1job1 102
job1 103
job1 104
job1 105
job1 106
job1 107
job1 108
job1 109
job1 110
使用 lock 的情況
lock在不同執行緒使用同一共享記憶體時,能夠確保執行緒之間互不影響,使用lock的方法是, 在每個執行緒執行運算修改共享記憶體之前,執行lock.acquire()將共享記憶體上鎖, 確保當前執行緒執行時,記憶體不會被其他執行緒訪問,執行運算完畢後,使用lock.release()將鎖開啟, 保證其他的執行緒可以使用該共享記憶體。
函式一和函式二加鎖
import threading
import time
defthread_job
(): print('t1 start\n')
for i in range(10):
time.sleep(0.1)
print('t1 finish\n')
deft2_job
(): print('t2 start\n')
print('t2 finish\n')
defmain
(): added_thread = threading.thread(target = thread_job)
thread2 = threading.thread(target = t2_job)
thread2.start()
added_thread.start()
added_thread.join() #等待前面執行完之後
thread2.join()
print('all done\n')
if __name__=='__main__':
main()
執行結果
job1 1
job1 2
job1 3
job1 4
job1 5
job1 6
job1 7
job1 8
job1 9
job1 10
job2 20
job2 30
job2 40
job2 50
job2 60
job2 70
job2 80
job2 90
job2 100
job2 110
python多執行緒鎖 python的多執行緒程式設計之鎖
1 背景概述 在python中,要保證資料的正確性,並且自己對資料進行控制,對資料進行加鎖並且自己釋放鎖。多執行緒的主要目的為了提高效能與速度,用在無關的方向是最好的,例如在使用爬蟲的時候,可以使用多執行緒來進行爬取資料,因為在這些執行緒之間沒有需要共同操作的資料,從而在這個時候利用是最好的。如果需...
python 多執行緒 鎖
參考 python cookbook 12章 啟動和停止執行緒 start 啟動執行緒 is alive 判斷是否已經結束 join 請求連線某個執行緒,等待該執行緒結束,才退出join函式 daemon引數,守護執行緒,該執行緒無法被連線,主線程結束後自動銷毀。2.7不適用 終止執行緒 需要自己構...
Python學習筆記 多執行緒鎖
多執行緒的鎖 如果有多個執行緒同時操作乙個物件,如果沒有很好地保護該物件,會造成程式結果的不可預期 多執行緒中,所有變數都由所有執行緒共享,所以,任何乙個變數都可以被任何乙個執行緒修改,因此,執行緒之間共享資料最大的危險在於多個執行緒同時改乙個變數,把內容給改亂了。因此需要用鎖threading.l...