Python進程、線程、協程之間的關係

1、從操做系統角度 操做系統處理任務, 調度單位是 進程 和 線程 。程序員

1.進程: 表示一個程序的執行活動 (打開程序、讀寫程序數據、關閉程序)數據庫

2.線程: 執行某個程序時, 該進程調度的最小執行單位 (執行功能1,執行功能2) 一個程序至少有一個進程 一個進程至少有一個線程安全

1.並行: 須要處理的任務數 == CPU核心數量 兩個任務 兩個核心 任務1:------------- 任務2:-------------網絡

2.併發: 須要處理的任務數 > CPU核心數量 三個任務 一個核心 任務1: ----- ------ 任務2: ------ 任務3: ------多線程

2、從程序角度 多進程和多線程 表示:當前程序能夠同時執行多個任務 進程和線程都是由 操做系統調度完成併發

1.進程:socket

   每一個進程都是有本身獨立的內存空間,不一樣進程之間的內存空間是不能共享。 不一樣進程之間的通訊是由操做系統來完成的。 不一樣進程之間的通訊效率低切換開銷也大。函數

2.線程:spa

  一個進程下能夠有多個線程,同一個進程內的線程能夠共享內存空間. 不一樣線程之間的通訊 有進程 管理。 不一樣線程之間的通訊效率高,切換開銷小。操作系統

3.互斥鎖:

  共享意味着多個線程的競爭 會致使不安全問題。 爲了保護內存空間的數據不被多個線程同時讀寫, 致使數據隱患, 因而誕生了" 互斥鎖 "。 "互斥鎖": 一種安全有序的讓多個線程訪問進程內存空間的機制。 當一個線程在訪問進程內存空間時, 互斥鎖能夠防止其餘線程訪問 解釋型語言:執行程序時,解釋器按行執行程序內容,執行時檢查問題。 編譯型語言:經過編譯器將程序編譯爲一個可執行文件,執行前檢查問題。

3、Python中的多線程: GIL(全局解釋器鎖): 同一時刻只能有一個線程在運行。

  壞處: 多線程不能充分利用多核CPU資源。

  好處: 從根本上杜絕了多線程訪問內存空間的安全問題。Python的多線程不適合並行, 但很是適合併發。 Python的多線程在遇到 IO阻塞函數執行, 會自動釋放GIL, 讓後面的線程執行任務。 若是沒有 IO 操做, 那麼解釋器會每隔100次操做後, 強制釋放GIL,讓後面的線程執行。 import sys sys.getcheckinterval()

  1.多進程:

    適用於密集CPU任務, 能夠充分調度CPU資源(大量的並行運算)。 multiprocessing 缺點:不適用於須要大量數據通訊和屢次切換的場景,由於進程之間通訊和切換成本高。

  2.多線程:

    適用於密集IO任務(網絡IO,磁盤IO,數據庫IO), 在IO阻塞時能夠切換線程執行。 threading.Thread、multiprocessing.dummy

 缺點:同一個CPU時間片只能執行一個任務,不能作到並行,只能作到併發。優勢:線程之間切換和通訊很是方便,開銷小。

  3.協程:

    由程序員自行編寫調度功能, 切換協程就比如切換一個函數, 幾乎沒有切換開銷。

    特色是在單線程上執行多個任務, 調度由程序員控制,不通過操做系統, 因此沒有進程線程的切換開銷, 也不須要處理鎖。

    gevent monkey.patch_all() monkey的做用是將Python底層的網絡庫socket、select自動打個補丁, 程序在遇到網絡IO阻塞時, 能夠自動切換協程工做。

    (該補丁不適用於本地IO)

  優勢:協程任務是基於用戶的,不通過操做系統,執行效率極高。    缺點:單線程執行,不能處理 CPU密集任務,和密集本地IO任務。
相關文章
相關標籤/搜索