同步鎖 死鎖 遞迴鎖 訊號量和同步evrnt物件(了解即可) 佇列--生產者消費者模型 程序
併發並行與同步非同步的概念併發: ☞系統具有處理多個任務(動作)的能力
並行: ☞系統具有同時處理多個任務(動作)的能力
並行時併發的乙個子集
同步:當程序執行到乙個io(等外部的資料)的時候,-------等:就是同步
-------不等:直到資料接收成功,在回來處理
gil:全域性解釋鎖(無論你啟動多少個執行緒,有多少個cup python在執行的時候會淡定的在同一時刻只允許乙個執行緒在執行)#因為有gil,所以同一時刻只有乙個執行緒被cpu執行
任務型別:io密集型 計算密集型對io密集型的任務 pythond的多執行緒是有意義的
對計算密集型的任務 pythond的多執行緒是沒有意義的(不推薦使用),可採用多程序+協程
同步鎖 案列問題在於加time.sleep(0.001)發生cpu切換 導致結果發生變化
為解決問題前code
importthreading
import
time
defsub():
'''#執行這裡時正常的(串型)
global num
num -= 1
'''#
執行這裡會發生異常
global
num temp =num
time.sleep(1) #
@問題在於加time.sleep(0.001)發生cpu切換 導致結果發生變化
num = temp - 1num = 100l =
for i in range(100):
t = threading.thread(target=sub)
t.start()
for t in
l: t.join()
print(num)
解決問題後code
importthreading
import
time
defsub():
'''#執行這裡時正常的(串型)
global num
num -= 1
'''global
num lock.acquire()
#@枷鎖
temp =num
time.sleep(0.01)
num = temp - 1lock.release()
#釋放鎖
num = 100l =
lock = threading.lock() #
枷鎖for i in range(100):
t = threading.thread(target=sub)
t.start()
for t in
l: t.join()
(num)
#這樣會引發乙個新的問題:可能會出現死鎖的情況
死鎖 案列code
importthreading
import
time
class
mythread(threading.thread):
defactiona(self):
a.acquire()
#獲得一把鎖
print(self.name,'
gota
',time.ctime())
time.sleep(2)
b.acquire()
print(self.name, '
gotb
', time.ctime())
time.sleep(1)
b.release()
#釋放b鎖
a.release() #
釋放a鎖
defactionb(self):
b.acquire()
#獲得一把鎖
print(self.name, '
gotb
', time.ctime())
time.sleep(2)
a.acquire()
print(self.name, '
gota
', time.ctime())
time.sleep(1)
a.release()
#釋放a鎖
b.release() #
釋放b鎖
defrun(self):
self.actiona()
self.actionb()
if__name__ == '
__main__':
a = threading.lock() #
建立a鎖
b = threading.lock() #
建立b鎖
l =
for i in range(5):
t =mythread()
t.start()
for i in
l: i.join()
print('
ending.........
')
解決死鎖code:原理相當於:我在用這把鎖時候,別人不能在用這把鎖
importthreading
import
time
class
mythread(threading.thread):
defactiona(self):
r_lock.acquire()
#獲得一把鎖
print(self.name,'
gota
',time.ctime())
time.sleep(2)
r_lock.acquire()
print(self.name, '
gotb
', time.ctime())
time.sleep(1)
r_lock.release()
#釋放b鎖
r_lock.release() #
釋放a鎖
defactionb(self):
r_lock.acquire()
#獲得一把鎖
print(self.name, '
gotb
', time.ctime())
time.sleep(2)
r_lock.acquire()
print(self.name, '
gota
', time.ctime())
time.sleep(1)
r_lock.release()
#釋放a鎖
r_lock.release() #
釋放b鎖
defrun(self):
self.actiona()
self.actionb()
if__name__ == '
__main__':
#a = threading.lock() #建立a鎖
#b = threading.lock() #建立b鎖
r_lock = threading.rlock() #
建立鎖物件
l =
for i in range(5):
t =mythread()
t.start()
for i in
l: i.join()
print('
ending.........
')
Python隨心記 練習
l1 11,22,33 l2 22,33,44 for item in l1 if item not inl2 print item 統計123455678組合兩位數且不能重複 num 0 for item in range 1,9 for vtem in range 1,9 if item vte...
Python隨心記 程序 執行緒
程序 執行緒 程序最小的資源單位 執行緒屬於最小的執行單元 程序可以理解為執行緒的容器 不能獨立存在,建立在程序的基礎之上 乙個程式至少有乙個程序,乙個程序至少有乙個執行緒 開啟執行緒例項import threading import time defhi num print hello d num...
Python隨心記 異常處理
異常處理try pass except valueerror as e print e 異常處理 多分支try pass except valueerror as e print e except keyerror as e print e 萬能異常try pass except exception...