快速理解進程、線程、協程的概念,它們的區別和共同點,以及應用場景。


一、進程、線程、協程的概念

  1、進程:

      教科書上最經典的一句話解釋:——進程是資源分配的最小單位

      實質上的理解:——先加載程序A的上下文,然后開始執行A,保存程序A的上下文,調入下一個要執行的程序B的程序上下文,然后開始執行B,保存程序B的上下文。進程的生命周期有調入,執行,保存的過程。

  2、線程:

      教科書上最經典的一句話解釋:——線程是CPU調度的最小單位

      實質上理解:——一個應用程序的執行可能有多個分支和多個程序段,就好比要實現程序A,實際分成 a,b,c等多個塊;這里的a,b,c就是線程,也就是說線程是共享了進程的上下文環境,單核任務中划分更為細小的CPU時間段

  3、協程:

    教科書上最經典的一句話解釋:——協程是線程的一種表現形式。

    實質上理解:——協程又稱微線程。在單線程上執行的多個任務,用函數切換,開銷極小。

    深入理解:子程序,或者稱為函數,在所有語言中都是層級調用,比如A調用B,B在執行過程中又調用了C,C執行完畢返回,B執行完畢返回,最后是A執行完畢。所以子程序調用是通過棧實現的,一個線程就是執行一個子程序。子程序調用總是一個入口,一次返回,調用順序是明確的。而協程的調用和子程序不同。協程看上去也是子程序,但執行過程中,在子程序內部可中斷,然后轉而執行別的子程序,在適當的時候再返回來接着執行。注意,在一個子程序中中斷,去執行其他子程序,不是函數調用,有點類似CPU的中斷

二、進程、線程、協程的區別

  1、多進程/多線程
    共同點 :表示可以同時執行多個任務,進程和線程的調度是由操作系統自動完成。

    區別:     

      進程:每個進程都有自己獨立的內存空間,不同進程之間的內存空間不共享。進程之間的通信有操作系統傳遞,導致通訊效率低,切換開銷大。

      線程:一個進程可以有多個線程,所有線程共享進程的內存空間,通訊效率高,切換開銷小。共享意味着競爭,導致數據不安全,為了保護內存空間的數據安全,引入"互斥鎖"。一個線程在訪問內存空間的時候,其他線程不允許訪問,必須等待之前的線程訪問結束,才能使用這個內存空間。

      互斥鎖:一種安全有序的讓多個線程訪問內存空間的機制。

      python的多線程:由於有GIL鎖的存在,一個線程需要執行任務,必須獲取GIL,好處:直接杜絕了多個線程訪問內存空間的安全問題。壞處:Python的多線程不是真正多線程,不能充分利用多核CPU的資源。

  2、多線程和協程之間的共同點和區別:

  共同點:

    都是並發操作,多線程同一時間點只能有一個線程在執行,協程同一時間點只能有一個任務在執行;

  不同點:

    多線程,是在I/O阻塞時通過切換線程來達到並發的效果,在什么情況下做線程切換是由操作系統來決定的,開發者不用操心,但會造成競爭條件。協程是用函數切換,開銷極小。不通過操作系統調度,沒有進程、線程的切換開銷。


三、應用場景
  如果是 I/O 密集型,且 I/O 請求比較耗時的話,使用協程。
    函數切換,占用資源少
  如果是 I/O 密集型,且 I/O 請求比較快的話,使用多線程。
    由操作系統切換,占用資源大,越快處理完越好
  如果是 計算 密集型,考慮可以使用多核 CPU,使用多進程。
    進程之間資源不共享,還可以用到多個CPU,如果使用線程的話,還要考慮到數據的安全性,使用互斥鎖。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM