并發(fā)編程之線程

啟動(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)鍵部分加鎖

image.png

創(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é)果。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容