那些年被我坑過的Python——你來我往(第九章 selectors)

進程、線程、協程(微線程)、隊列的概念理解

進程
進程是全部相關資源的集合,而線程是和CPU交互的最小單元
進程至少包含一個線程,是主線程

線程
線程之間能夠共享資源
線程同時修改同一份數據時必須加鎖,mutex爲互斥鎖
遞歸鎖編程

是爲了防止鎖死的狀況而使用的機制,機制是把對應的鎖與鎖的釋放對應起來

join()等待線程的執行結果!

守護線程
做用:服務於非守護線程(非守護線程至關於Master,守護線程至關於Slave),因此若是非守護線程停掉以後,守護線程會隨之中止,設置爲守護線程的含義是沒必要等待它執行完成,或者說守護線程的執行結果是否完成從主要邏輯上不該對主線程的執行有任何影響。因此設置完守護進程以後就沒有必要使用join來等待全部守護線程執行完成。


隊列(queue)的做用:
一、解耦,使程序直接實現鬆耦合
二、提升處理效率

隊列的分類:
先進先出FIFO first in first out
後進先出LIFO last in first out

隊列是有序的
隊列與列表的區別是 它僅有一份數據,當數據讀取使用後則從隊列中消除,而列表是長時間持有


何時使用Python多線程(假多線程):
基礎須知:
IO操做不佔用cpu(內存、硬盤讀寫、網絡傳輸)
計算使用cpu
上下文切換會佔用資源

因此
Python多線程
不適合CPU密集操做型的任務
而適合IO操做密集型的任務

Python
Python使用的進程是系統原生進程,而線程是包裝的網絡

線程會受到GIL的管理,但進程不受;因此多進程是解決CPU密集操做型更好利用多核CPU的可行辦法,而多線程不適合



進程Queue和線程queue的區別!
進程的能夠在多進程間通訊
線程的只能在一個進程的多個線程之間通訊


進程池
同一時間有多少進程運行,避免啓太多進程佔光系統資源,理解:多線程

由於Python使用的是系統的原生進程,因此若是過多的Forking會使得系統資源迅速被佔光,併發

使用進程池的目的是爲了更好的管控程序佔用的系統資源,至關於地鐵刷卡門禁,統一時間只能有有限個數的人經過,某我的經過後相應的位置就空出就容許下一我的繼續刷卡

socket

 協程高併發

協程,又稱微線程,纖程。英文名Coroutine。一句話說明什麼是線程:協程是一種用戶態的輕量級線程url

協程擁有本身的寄存器上下文和棧。協程調度切換時,將寄存器上下文和棧保存到其餘地方,在切回來的時候,恢復先前保存的寄存器上下文和棧。所以:spa

協程能保留上一次調用時的狀態(即全部局部狀態的一個特定組合),每次過程重入時,就至關於進入上一次調用的狀態,換種說法:進入上一次離開時所處邏輯流的位置。線程

 

協程的好處:協程

  • 無需線程上下文切換的開銷
  • 無需原子操做鎖定及同步的開銷
  • 方便切換控制流,簡化編程模型
  • 高併發+高擴展性+低成本:一個CPU支持上萬的協程都不是問題。因此很適合用於高併發處理。

缺點:

  • 沒法利用多核資源:協程的本質是個單線程,它不能同時將 單個CPU 的多個核用上,協程須要和進程配合才能運行在多CPU上.固然咱們平常所編寫的絕大部分應用都沒有這個必要,除非是cpu密集型應用。
  • 進行阻塞(Blocking)操做(如IO時)會阻塞掉整個程序

使用yield實現協程操做例子    


gevent是對greenlet的自動封裝

urllib和socket默認不支持gevent

相關文章
相關標籤/搜索