Python隨心記 鎖

2022-06-23 03:03:11 字數 3926 閱讀 3695

同步鎖 死鎖 遞迴鎖 訊號量和同步evrnt物件(了解即可) 佇列--生產者消費者模型 程序
併發並行與同步非同步的概念

併發: ☞系統具有處理多個任務(動作)的能力

並行: ☞系統具有同時處理多個任務(動作)的能力

並行時併發的乙個子集

同步:當程序執行到乙個io(等外部的資料)的時候,-------等:就是同步

-------不等:直到資料接收成功,在回來處理

gil:全域性解釋鎖(無論你啟動多少個執行緒,有多少個cup python在執行的時候會淡定的在同一時刻只允許乙個執行緒在執行)

#因為有gil,所以同一時刻只有乙個執行緒被cpu執行

任務型別:io密集型  計算密集型

對io密集型的任務 pythond的多執行緒是有意義的

對計算密集型的任務 pythond的多執行緒是沒有意義的(不推薦使用),可採用多程序+協程

同步鎖 案列

問題在於加time.sleep(0.001)發生cpu切換 導致結果發生變化

為解決問題前code

import

threading

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
import

threading

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()

print

(num)

#這樣會引發乙個新的問題:可能會出現死鎖的情況

死鎖 案列code
import

threading

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:原理相當於:我在用這把鎖時候,別人不能在用這把鎖
import

threading

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...