python筆記 程序和執行緒 多執行緒

2021-08-21 05:12:05 字數 2773 閱讀 3796

一、建立乙個多程序

啟動乙個執行緒就是把乙個函式傳入並建立thread例項,然後呼叫start()開始執行:

1.1**及執行結果

如以上**所示,threading.current_thread()返回程序例項,用threading.current_thread().name返回例項名稱,主線程例項的名字叫mainthread,子執行緒的名字在建立時指定,我們用loopthread命名子執行緒【注意**中tt = threading.thread(target=loop, name='loopthread')】。名字僅僅在列印時用來顯示,完全沒有其他意義,如果不起名字python就自動給執行緒命名為thread-1,thread-2……

執行:

二、lock

多程序中,同乙個變數,各自有乙份拷貝存在於每個程序中,互不影響,而多執行緒中,所有變數都由所有執行緒共享,所以,任何乙個變數都可以被任何乙個執行緒修改,因此,執行緒之間共享資料最大的危險在於多個執行緒同時改乙個變數,把內容給改亂了。

2.1多個執行緒同時改乙個變數示例

2.1.1多個執行緒同時改乙個變數示例**

2.1.2多個執行緒同時改乙個變數示例執行結果

2.1.3執行原理解剖:

原因是因為高階語言的一條語句在cpu執行時是若干條語句,即使乙個簡單的計算:

balance=balance+n
可以視作

1、計算balance + n,存入臨時變數中;

2、將臨時變數的值賦給balance。

即:

x=balance+n

balance=x

由於兩個執行緒是交替執行 ,又修改balance需要多條語句,而執行這幾條語句時,執行緒可能中斷,從而導致多個執行緒把同乙個物件的內容改亂了,故當迴圈次數足夠 for i in range(1000000):

可以將執行過程視作如下步驟:

初始值 balance = 0

t1: x1 = balance + 5 # x1 = 0 + 5 = 5

t2: x2 = balance + 8 # x2 = 0 + 8 = 8

t2: balance = x2 # balance = 8

t1: balance = x1 # balance = 5

t1: x1 = balance - 5 # x1 = 5 - 5 = 0

t1: balance = x1 # balance = 0

t2: x2 = balance - 8 # x2 = 0 - 8 = -8

t2: balance = x2 # balance = -8

結果 balance = -8

2.2 防止多個執行緒同時改乙個變數的解決方案

如果我們要確保balance計算正確,就要給change_it()上一把鎖,當某個執行緒開始執行change_it()時,我們說,該執行緒因為獲得了鎖,因此其他執行緒不能同時執行change_it(),只能等待,直到鎖被釋放後,獲得該鎖以後才能改。由於鎖只有乙個,無論多少執行緒,同一時刻最多只有乙個執行緒持有該鎖,所以,不會造成修改的衝突。

2.2.1三步驟實現解決方案

第一步:建立鎖,通過threading.lock()來實現

第二步:獲取鎖,當多個執行緒同時執行lock.acquire()時,只有乙個執行緒能成功地獲取鎖,然後繼續執行**,其他執行緒就繼續等待直到獲得鎖為止。

第三部:釋放鎖,獲得鎖的執行緒用完後一定要用 lock.release()釋放鎖,否則那些苦苦等待鎖的執行緒將永遠等待下去,成為死執行緒。所以我們用try...finally來確保鎖一定會被釋放。

2.2.2上鎖**

balance = 0

lock = threading.lock()

def run_thread(n):

for i in range(100000):

# 先要獲取鎖:

lock.acquire()

try:

# 放心地改吧:

change_it(n)

finally:

# 改完了一定要釋放鎖:

lock.release()

2.2.3全部**及執行結果

執行結果:

2.2.4 上鎖的解決方案的優缺點

鎖的好處就是確保了某段關鍵**只能由乙個執行緒從頭到尾完整地執行,壞處當然也很多,首先是阻止了多執行緒併發執行,包含鎖的某段**實際上只能以單執行緒模式執行,效率就大大地下降了。其次,由於可以存在多個鎖,不同的執行緒持有不同的鎖,並試圖獲取對方持有的鎖時,可能會造成死鎖,導致多個執行緒全部掛起,既不能執行,也無法結束,只能靠作業系統強制終止。

python捕捉執行緒錯誤 python 多執行緒錯誤

我想用多執行緒查詢資料庫,然後進行資料操作。list range 19999,100000 pool threadpool 10 results pool.map main,list pool.close pool.join def main i print i query id,link,keyw...

python多執行緒怎麼寫 Python多執行緒寫日誌

我有乙個http伺服器類,支援多執行緒處理,當把結果寫回客戶端時,它也會寫一些日誌 日誌模組 它減慢了請求的速度,而且由於post get方法只在 return 發生之後才返回,所以我必須在傳送結果之前寫入日誌。我希望通過開啟另乙個接收訊息的執行緒來完成,並編寫日誌。我希望我的日誌物件是 stati...

python多執行緒鎖實戰 Python多執行緒鎖

在多執行緒程式執行過程中,為什麼需要給一些執行緒加鎖以及如何加鎖,下面就來說一說。1.給執行緒加鎖的原因 我們知道,不同程序之間的記憶體空間資料是不能夠共享的,試想一下,如果可以隨意共享,談何安全?但是乙個程序中的多個執行緒是可以共享這個程序的記憶體空間中的資料的,比如多個執行緒可以同時呼叫某一記憶...