# 線程

[比較1](https://zhuanlan.zhihu.com/p/20953544) [比較2(範例)](https://zhuanlan.zhihu.com/p/24283040)

[線程概念](http://libersky.tumblr.com/post/59939987956/%E9%80%B2%E7%A8%8Bprocess%E8%A1%8C%E7%A8%8B%E7%B7%9A%E7%A8%8Bthread%E5%9F%B7%E8%A1%8C%E7%B7%92%E5%A4%9A%E7%B7%9A%E7%A8%8Bmultithreading%E5%A4%9A%E5%9F%B7) [線程概念\[2\]](http://www.cnblogs.com/chushiyaoyue/p/5818012.html)

[查看線程與核心數](http://felixgzf.blog.51cto.com/4108324/1260549)

[線程簡易範例-python](http://qinqianshan.com/python-multithreading-threading-module/)

[線程爬蟲範例-python](http://howard-ho-blog.logdown.com/posts/1345151)

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

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

### [join() vs setDaemon()](http://www.cnblogs.com/alan-babyblog/p/5325071.html)

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

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

start與join的順序([url](http://www.cnblogs.com/lipijin/p/3709903.html)):

```python
#先全部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/>
