啟動(dòng)與停止線程
- 庫(kù)可以在單獨(dú)的線程中執(zhí)行任何的在Python中可以調(diào)用的對(duì)象
import time
from threading import Thread
def countdown(n):
while n > 0:
print('T-minus', n)
n -= 1
time.sleep(1)
t = Thread(target=countdown, args=(6,))
t.start()
t.join() # 調(diào)用線程t的join()函數(shù),會(huì)把這個(gè)線程t加入到當(dāng)前線程(這里就是主線程),當(dāng)前線程就會(huì)等待線程t的終止,才執(zhí)行后續(xù)內(nèi)容
當(dāng)你創(chuàng)建好一個(gè)線程對(duì)象后,該對(duì)象并不會(huì)立即執(zhí)行,除非你調(diào)用它的start()方法(當(dāng)你調(diào)用start()方法時(shí),它會(huì)調(diào)用你傳遞進(jìn)來(lái)的函數(shù),并把你傳遞進(jìn)來(lái)的參 數(shù)傳遞給該函數(shù))。Python中的線程會(huì)在一個(gè)單獨(dú)的系統(tǒng)級(jí)線程中執(zhí)行(比如說(shuō)一個(gè)POSIX線程或者一個(gè)Windows線程),這些線程將由操作系統(tǒng)來(lái)全權(quán)管理。線程一旦 啟動(dòng),將獨(dú)立執(zhí)行直到目標(biāo)函數(shù)返回。你可以查詢一個(gè)線程對(duì)象的狀態(tài),看它是否還在 執(zhí)行:
if t.is_alive():
print("Still running")
else:
print("Completed")
對(duì)于需要長(zhǎng)時(shí)間運(yùn)行的線程或者需要一直運(yùn)行的后臺(tái)任務(wù),你應(yīng)當(dāng)考慮使用后臺(tái)線程。這些線程會(huì)在主線程終止時(shí)自動(dòng)銷毀。例如:
t = Thread(target=countdown, args=(6,), daemon=True)
t.start()
- 由于全局解釋鎖(GIL)的原因,Python的線程被限制到同一時(shí)刻只允許一個(gè)線 程執(zhí)行這樣一個(gè)執(zhí)行模型。所以, 的線程更適用于處理I/O和其他需要并發(fā)執(zhí) 行的阻塞操作(比如等待I/O、等待從數(shù)據(jù)庫(kù)獲取數(shù)據(jù)等等),而不是需要多處理器并行的計(jì)算密集型任務(wù)。
線程間通信
- 線程間數(shù)據(jù)是共享的,沒(méi)什么好說(shuō)的
給關(guān)鍵部分加鎖

創(chuàng)建線程池
-
使用ThreadPoolExecutor相對(duì)于手動(dòng)實(shí)現(xiàn)的好處是它使得任務(wù)提交者更方便的從被調(diào)用函數(shù)中獲取返回值。
image.png
例子中返回的handle對(duì)象會(huì)幫你處理所有的阻塞與協(xié)作,然后從工作線程中返回?cái)?shù)據(jù)給你。特別的, 操作會(huì)阻塞進(jìn)程直到對(duì)應(yīng)的函數(shù)執(zhí)行完成并返回一個(gè) 結(jié)果。
