執行緒
什麼是執行緒?
執行緒是cpu排程的最小單位。而程序是資源分配的最小單位,程序和執行緒是什麼關係?
執行緒是在程序中的乙個執行單位,多程序 本質上開啟的這個程序裡就有乙個執行緒
多程序 本質上開啟的這個程序裡就有乙個執行緒
多執行緒 單純的在當前程序中開啟了多個執行緒
執行緒和程序的區別:
執行緒的開啟,銷毀,任務切換的時間開銷小
在同乙個程序中資料共享
能實現併發,但不能脫離程序
程序負責管理分配資源 執行緒負責執行**
gil 鎖 ---全域性直譯器鎖
同一時刻只能在有乙個執行緒訪問cpu----執行緒鎖
cpython直譯器 ----copy jpython
python程式效率下降
高計算型-----多執行緒會導致程式的效率下降
高io型的-----可以使用多執行緒
多程序分布式計算-------celery
import timefrom threading import thread,currentthread,enumerate,activecount
def func():
print('-->',currentthread())
time.sleep(0.1)
print(123)
t = thread(target=func)
t.start()
print(t.is_alive())
print(t.getname())
t.setname('t1')
print(t.getname())
# print(currentthread())
# print(enumerate()) # 你啟動的活著的執行緒數 + 1(主線程)
print('-->',activecount()) # 相當於len(enumerate())
# 守護執行緒
# 守護程序是等待主程序**結束之後就結束
# 守護執行緒是等待主線程都結束之後才結束
import time當多執行緒爭奪鎖時,允許第乙個獲得鎖的執行緒進入臨街區,並執行**。所有之後到達的執行緒將被阻塞,只到第乙個執行緒執行結束,退出臨界區,並釋放鎖。from threading import thread,lock
def func(lock):
global n
temp = n
n = temp -1
n = 100
t_lst =
lock = lock()
for i in range(100):
t = thread(target=func,args=(lock,))
t.start()
for t in t_lst:t.join()
print(n)
多個執行緒搶占資源的情況:
import time執行輸出:99from threading import thread
def func():
global n
temp = n
time.sleep(1)
n = temp -1
n = 100
t_lst =
for i in range(100):
t = thread(target=func)
t.start()
for t in t_lst:t.join()
print(n)
明明減少了100次,結果應該是0的。
為啥是99呢?難度是gil的問題,但gil是計算cpu那一刻的鎖
下面開始具體分析:
第一步,每個執行緒執行
global n:temp =n 此時,temp等於100
第二步:當執行緒設計到cpu計算時,向cpu傳送請求。但是收到gil的限制
同一時刻,只能有乙個執行緒計算。
cpu計算結果後,返回給執行緒。執行緒賦值,並修改全域性變數n。此時n=99,執行緒結束
那麼其他執行緒,也是做同樣的操作。
每個執行緒賦值n等於99。不管它已經是99了。
上面的現象,出現了資料不安全的情況
最後賦值了100次,都是n=99。所以最終結果是99
怎麼解決呢?加鎖
import time執行輸出:0from threading import thread,lock
def func(lock):
global n
lock.acquire() #加鎖
temp = n
n = temp -1
lock.release() #解鎖
n = 100
t_lst =
lock = lock() #建立鎖
for i in range(100):
t = thread(target=func,args=(lock,))
t.start()
for t in t_lst:t.join() #等待所有子執行緒結束
print(n)
如果把計算和賦值拆開,就會出現資料不安全的情況
下面寫法,不用加鎖,也可以得到0
from threading import thread執行輸出:0def func():
global n
n -= 1
n = 100
for i in range(100):
t = thread(target=func)
t.start()
因為預設有乙個gil鎖,所以每個執行緒都減等1。所以最終結果為0
程序也有死鎖與遞迴鎖,在程序那裡忘記說了,放到這裡一切說了額
所謂死鎖: 是指兩個或兩個以上的程序或執行緒在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序,如下就是死鎖12
3456
from
threading
import
lock
lock
=
lock()
# 在同乙個執行緒中,能夠被乙個鎖的多個acquire阻住,這種鎖就叫做互斥鎖
lock.acquire()
lock.acquire()
lock.acquire()
死鎖,也叫互斥鎖
科學家吃麵的問題
要完成一件事情 需要兩個必要因素
要想吃到面,需要: 叉子,面
資源的互相搶占的問題 —— 死鎖
四個人圍著一張桌子,桌子上放著一碗面,碗裡有乙個叉子
必須拿到叉子,才能吃麵。
每個人每次只能吃一口面,吃完就放回去,讓下乙個人吃。
科學家吃麵的問題
要完成一件事情 需要兩個必要因素
要想吃到面,需要: 叉子,面
資源的互相搶占的問題 —— 死鎖
四個人圍著一張桌子,桌子上放著一碗面,碗裡有乙個叉子
必須拿到叉子,才能吃麵。
每個人每次只能吃一口面,吃完就放回去,讓下乙個人吃。
day4 2陣列及方法
陣列 js陣列 可以存放任意資料型別的資料 如果索引大於陣列的長度,陣列自動增加到該索引值加1的長度 var arr terry larry boss arr 3 jacky 新增元素 陣列程度變為 4注意!陣列最多可以包含4 294 967 295個項 方法 sort 如果呼叫該方法時沒有使用引數...
Day4 2 大皇宮邊寄post card
從臥佛寺走過去大皇宮的路上,見到一家郵局,那就寄一點明信片回去,紀念一下。這邊的郵局是紅色的,郵筒也是紅色的,門口雖然小了點,但還是比較顯眼的。或許這邊的快遞沒有這麼發達,郵政承擔了大部分快遞的派發任務。不少快遞都被擺在郵局裡面,也見到有當地人來郵局寄快遞。郵局裡面的人還是比較少的,而且有空調,剛好...
python全棧學習 day02
pycharm 安裝設定 啟用步驟 1 改host 2.輸入啟用資訊,注意有效期.python 邏輯運算子 返回的均為bool值 與 and a and b或 or a or b非 not not a格式化輸出 name input your name is age input your age i...