?
?
鎖是怎么存在的?
在python建立之初,開發者目的是為了快速把語言開發出來,如果加上GIL(c語言加鎖),切換時按照100條字節指令來進行線程間的切換
?
為什么加鎖?
非線程安全,控制一段代碼
1.lock = threading.BoundedSemaphore
一次可以限制關卡,限制通行次數,不過這個是寫死的
1 import time 2 import threading 3 lock = threading.BoundedSemaphore(3)#一次放三個(一次只通行三個) 4 def func(arg): 5 lock.acquire() 6 time.sleep(1) 7 print(arg) 8 lock.release() 9 for i in range(20): 10 t = threading.Thread(target=func, args=(i,)) 11 t.start()
?
2.
lock = threading.Condition()
一次可以限制關卡,限制通行次數,不過這個是寫活的
可以自定義加載個數 ,只需在后面便利后加一個參數
lock.notify(inp) inp 來限制次數
1 lock = threading.Condition() 2 def func(arg): 3 print('線程進來了') 4 lock.acquire() 5 lock.wait() # 加鎖這個特殊需要等待參數傳遞 6 print(arg) 7 time.sleep(1) 8 lock.release() 9 for i in range(10): 10 t =threading.Thread(target=func,args=(i,)) 11 t.start() 12 while True: 13 inp = int(input('>>>')) 14 lock.acquire() 15 lock.notify(inp)#加的控制次數的 這個是特殊的 16 lock.release()
?
3.
lock = threading.Event() 獲取全部
注意.獲取全部使用 lock.wait() 加鎖的
input(">>>>") 是用來控制是否全部獲取的一個開關,一旦輸入 ,解鎖會獲取全部 后面需要加入 lock.set() 綠燈
如果想再次使用這個函數, lock.clear() 重新清空
1 import time 2 import threading 3 4 lock = threading.Event() 5 6 def func(arg): 7 print('線程來了') 8 lock.wait() # 加鎖:紅燈 9 print(arg) 10 for i in range(10): 11 t =threading.Thread(target=func,args=(i,)) 12 t.start() 13 input(">>>>") 14 lock.set() # 綠燈 15 lock.clear() # 再次變紅燈 16 for i in range(10): 17 t =threading.Thread(target=func,args=(i,)) 18 t.start() 19 input(">>>>") 20 lock.set()
4.
v = threading.local()#內部創建一個屬于自己的值 phone=arg 為了區分自己拿的包
?
1 import time 2 import threading 3 v = threading.local() 4 def func(arg): 5 # 內部會為當前線程創建一個空間用于存儲:phone=自己的值 6 v.phone = arg 7 time.sleep(2) 8 print(v.phone,arg) # 去當前線程自己空間取值 9 for i in range(10): 10 t =threading.Thread(target=func,args=(i,)) 11 t.start()
?
?
?
?
?
?
?
?
線程池: 用來約束每次輸出的次數,不是全部哪出啊,可以限制一次拿出幾個
1 from concurrent.futures import ThreadPoolExecutor 2 import time 3 def func(a1,a2): 4 time.sleep(5) 5 print(a1,a2) 6 a=ThreadPoolExecutor(4)#實例化對象讓其限制次數 7 for i in range(40): 8 a.submit(func,i,15)
生產者,消費者模型
這種模型在多線程中屬于按順序使用 ?現有生產才有消費,這個是一個固定順序,而在函數中,為了更明確這種概念而不考慮生產時間限制
來更符合邏輯性 出現了queue 模塊 ?首先實例化對象 ?q=queue.Queue 在用方法q.put(" ") 括號里面必須有字符串提示從這里入,符合隊列(先進先出)而拋開邏輯
后面用q.get( ) 方法提示出來了
1 import time 2 import threading 3 import queue 4 q=queue.Queue()#實例化對象 5 def mk(id): 6 while 1: 7 time.sleep(3) 8 q.put("布加迪")#首先進入q.put 9 print("師傅%s 生產了一個布加迪"% id) 10 for i in range(1,3): 11 t=threading.Thread(target=mk,args=(i,)) 12 t.start() 13 def et(id): 14 while 1: 15 time.sleep(1) 16 v1=q.get()#然后沖進去 17 print("連達%s 吃了一個布加迪"% id) 18 for i in range(1,6): 19 t1=threading.Thread(target=et,args=(i,)) 20 t1.start()
?