多線程/多進程/協程


占用的資源:進程>線程>協程


進程:先加載程序A的上下文,然后開始執行A,保存程序A的上下文,調入下一個要執行的程序B的程序上下文,然后開始執行B,保存程序B的上下文

進程的顆粒度太大,每次都要有上下的調入,保存,調出。

線程:一個軟件的執行不可能是一條邏輯執行的,必定有多個分支和多個程序段,就好比要實現程序A,實際分成 a,b,c等多個塊組合而成;這里的a,b,c就是線程,也就是說線程是共享了進程的上下文環境,的更為細小的CPU時間段

https://www.zhihu.com/question/25532384/answer/81152571--zhonyong的回答

進程只是資源分配的單位,線程才是cpu執行的單位

所以一般情況下,線程是可以用到多核的

只不過,在python中就比較特殊,本來創建了多個線程,但python解釋器對外聲稱每個時間片只有一個線程要運行,所以對cpu來講,只能看到一個線程,就變成單線程了;都是GIL搞的鬼

(GIL鎖原因:剛開始單線程夠用了,而且完美解決線程安全問題;現在就苦逼了。。。)

基於這種情況,出現了補救措施:multiprocessing

python解釋器給multiprocessing.Process的每個對象都給了一把鎖玩,所以是真的多任務


並發/並行:多個任務,一個核執行就是並發;每個任務都有一個核執行,就是並行

python中的多線程就是並發,多進程才是並行

即並行/並發與是不是線程沒關系,只和任務數/核心數有關系;如果沒有GIL,多線程也能實現並行

(之前以為只要是多線程就一定是並發,即單個cpu手忙腳亂一會執行這個一下,一會又去執行那個一下;實際上,cpu的眼里只有線程,所以才說線程是cpu調度的單位)


單線程/多線程:

代碼是計算密集型的,單線程比多線程快,多線程執行1000命令后就會被GIL切換掉,而切換是要消耗資源的;

計算密集型的多任務:multiprocessing創建多進程,真的多任務,每個進程有各自的GIL

代碼是io密集型的,多線程更快,因為有的切換,單線程都沒得切換,只能等

io密集型的線程與協程:協程更快,因為是在線程內切換,線程層面都不切的

但一般程序並不是純io,也是有計算的,所以這就是協程的缺點,畢竟是單線程的;所以線程的優勢就又體現出來了


只能這么比較通俗的講,底層還有用戶線程/內核線程什么的 (這篇看着還不錯,基本清晰),即該開始只有進程,沒有線程,但進程太麻煩了,所以應用級搞了個線程,但內核不支持線程這個東西,依舊按進程來調;后來內核支持了線程,即調的是線程了

最根本的還是要看一本操作系統原理的書,才能理解透徹了


免責聲明!

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



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