線程

比較1 比較2(範例)

線程概念 線程概念[2]

查看線程與核心數

線程簡易範例-python

線程爬蟲範例-python

python的多線程並不是真正平行運算,即使一個程式開啟了多線程,在同一時間中真正在運行的線程只有一個,其他線程則是等待獲得GIL後才能進行,整體來說就是交替執行

1個程式只擁有一個GIL,如果想真正達到平行運算則需使用多進程(multiprocessing)

join --> 主線程等待子線程完成後才繼續執行(可設置timeout),start()後再加入join屬性

setDaemon --> 主線程不等子線程,需在線程start()之前設定

start與join的順序(url):

#先全部start 再全部join,
cores=[core1,core2]
for c in cores:
    c.start()
for c in cores:
    c.join()

GIL(Global Interpreter Lock)

一個進程中都有一個GIL,線程必須取得GIL後才能運行,達到特定條件(ticks)後該線程才會釋出GIL,換下一個線程運行

CPU密集型 VS I/O密集型

CPU密集型 --> 各種for、if邏輯判斷,較花費CPU資源,容易觸發GIL交換,多線程不適合處理此問題,可能因為GIL轉換導致程式效率更差

I/O密集型 --> 讀寫文件、爬蟲,可以在線程等待回應時啟動另一線程執行新任務,避免浪費等待時間,多線程在此問題中效果較明顯

concurrent.futures

https://www.jianshu.com/p/e3a2df19c41a

額 外參考資料

http://www.cnblogs.com/kaituorensheng/p/4445418.html#_label4

https://blog.aweimeow.tw/Cheatsheet-for-python-subprocess/

Last updated