Python基礎 多執行緒與Lock鎖

2021-08-13 17:16:29 字數 2798 閱讀 9763

python的執行緒是真正的posix thread,而不是模擬出來的執行緒。

python的標準庫提供了兩個模組_thread低階模組和threading高階模組(重點)

執行示例

由於任何程序預設就會啟動乙個執行緒,我們把該執行緒稱為主線程,主線程又可以啟動新的執行緒,python的threading模組有個current_thread()函式,它永遠返回當前執行緒的例項。主線程例項的名字叫mainthread,子執行緒的名字在建立時指定,我們用loopthread命名子執行緒。名字僅僅在列印時用來顯示,完全沒有其他意義,如果不起名字python就自動給執行緒命名為thread-1,thread-2……

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

# 多執行緒

import time, threading

# 新執行緒的執行的**

defloop

(): print("子執行緒 %s 開始執行" % threading.current_thread().name)

n = 0

while n < 5:

n = n +1

print("子執行緒 %s >>> %d " % (threading.current_thread().name, n))

time.sleep(1)

print("子執行緒 %s 結束執行" % threading.current_thread().name)

deftestrun

():# 任何程序預設啟動乙個執行緒,且該程序預設稱為主程序

print("主線程 %s 開始執行" % threading.current_thread().name)

# 主程序可以啟動新的程序,名稱可以自己定義,預設thread-1

t = threading.thread(target=loop, name = "myloopthread")

t.start()

t.join()

print("主線程 %s 結束執行" % threading.current_thread().name)

testrun()

執行結果

d:\pythonproject>python main.py

主線程 mainthread 開始執行

子執行緒 myloopthread 開始執行

子執行緒 myloopthread >>> 1

子執行緒 myloopthread >>> 2

子執行緒 myloopthread >>> 3

子執行緒 myloopthread >>> 4

子執行緒 myloopthread >>> 5

子執行緒 myloopthread 結束執行

主線程 mainthread 結束執行

**事故,示例

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

# 程序安全鎖 lock

import time, threading

# 銀行存款

money = 0

defchange_money

(value):

# 全域性變數

global money

# 存了就馬上取出,維持能量守恆定律

money = money + value

money = money - value

defrun_thread

(value):

for i in range(100000):

change_money(value)

deftestthread

():# 執行緒 1

t1 = threading.thread(target = run_thread, args = (5,))

# 執行緒 2

t2 = threading.thread(target = run_thread, args = (8,))

t1.start()

t2.start()

t1.join()

t2.join()

# 理論值需要為0,由於出現程序相互競爭,導致出現非0

print(money)

testthread()

執行結果

d:\pythonproject>python main.py

0 nice

d:\pythonproject>python main.py

13 這個值不是我們喜歡的

加入lock鎖優化

# 銀行存款

money = 0

# 建立乙個鎖

lock = threading.lock()

defrun_thread

(value):

for i in range(100000):

# 獲取鎖

lock.acquire()

try:

change_money(value)

finally:

# 釋放鎖

lock.release()

然後就ok了

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

Python基礎 多執行緒

多執行緒在程式開發過程中特別重要,我們往往把一些耗時的操作在子執行緒中執行,這就是所謂的多執行緒了。在c 11中,寫了一些關於多執行緒的部落格。python也不例外,當然也要有多執行緒了。python提供了兩個模組來實現多執行緒thread 和threading thread 有一些缺點,在thre...

Python基礎 多執行緒

多工可以由多程序完成,也可以由乙個程序內的多執行緒完成。我們前面提到了程序是由若干執行緒組成的,乙個程序至少有乙個執行緒。由於執行緒是作業系統直接支援的執行單元,因此,高階語言通常都內建多執行緒的支援,python也不例外,並且,python的執行緒是真正的posix thread,而不是模擬出來的...

python 多執行緒基礎

join 等待某執行緒結束在繼續執行 queue 儲存程序結果 執行緒鎖在cpython中存在gil,大家可以嘗試其他直譯器版本,可能就不會存在gil了 import threadingprint threading.active count 列印已啟用執行緒數print threading.enu...