python全棧學習 day42

2022-05-02 17:27:08 字數 3862 閱讀 7355

執行緒

什麼是執行緒?

執行緒是cpu排程的最小單位。而程序是資源分配的最小單位,程序和執行緒是什麼關係?

執行緒是在程序中的乙個執行單位,多程序 本質上開啟的這個程序裡就有乙個執行緒

多程序 本質上開啟的這個程序裡就有乙個執行緒

多執行緒 單純的在當前程序中開啟了多個執行緒

執行緒和程序的區別:

執行緒的開啟,銷毀,任務切換的時間開銷小

在同乙個程序中資料共享

能實現併發,但不能脫離程序

程序負責管理分配資源 執行緒負責執行**

gil 鎖  ---全域性直譯器鎖

同一時刻只能在有乙個執行緒訪問cpu----執行緒鎖

cpython直譯器 ----copy jpython

python程式效率下降

高計算型-----多執行緒會導致程式的效率下降

高io型的-----可以使用多執行緒

多程序分布式計算-------celery

import time

from 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

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

執行輸出:99

明明減少了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

from 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

如果把計算和賦值拆開,就會出現資料不安全的情況

下面寫法,不用加鎖,也可以得到0

from threading import thread

def func():

global n

n -= 1

n = 100

for i in range(100):

t = thread(target=func)

t.start()

執行輸出:0

因為預設有乙個gil鎖,所以每個執行緒都減等1。所以最終結果為0

程序也有死鎖與遞迴鎖,在程序那裡忘記說了,放到這裡一切說了額

所謂死鎖: 是指兩個或兩個以上的程序或執行緒在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序,如下就是死鎖12

3456

fromthreadingimportlock

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