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