線程
python的多線程並不是真正平行運算,即使一個程式開啟了多線程,在同一時間中真正在運行的線程只有一個,其他線程則是等待獲得GIL後才能進行,整體來說就是交替執行
1個程式只擁有一個GIL,如果想真正達到平行運算則需使用多進程(multiprocessing)
join --> 主線程等待子線程完成後才繼續執行(可設置timeout),start()後再加入join屬性
setDaemon --> 主線程不等子線程,需在線程start()之前設定
start與join的順序(url):
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
Last updated