一、進程、線程、協程的概念
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 請求比較快的話,使用多線程。
如果是 計算 密集型,考慮可以使用多核 CPU,使用多進程。