占用的資源:程序》執行緒》協程
程序的顆粒度太大,每次都要有上下的調入,儲存,調出。
執行緒:乙個軟體的執行不可能是一條邏輯執行的,必定有多個分支和多個程式段,就好比要實現程式a,實際分成 a,b,c等多個塊組合而成;這裡的a,b,c就是執行緒,也就是說執行緒是共享了程序的上下文環境,的更為細小的cpu時間段
的回答程序只是資源分配的單位,執行緒才是cpu執行的單位
所以一般情況下,執行緒是可以用到多核的
只不過,在python中就比較特殊,本來建立了多個執行緒,但python直譯器對外聲稱每個時間片只有乙個執行緒要執行,所以對cpu來講,只能看到乙個執行緒,就變成單執行緒了;都是gil搞的鬼
(gil鎖原因:剛開始單執行緒夠用了,而且完美解決執行緒安全問題;現在就苦逼了。。。)
基於這種情況,出現了補救措施:multiprocessing
python直譯器給multiprocessing.process的每個物件都給了一把鎖玩,所以是真的多工
併發/並行:多個任務,乙個核執行就是併發;每個任務都有乙個核執行,就是並行
python中的多執行緒就是併發,多程序才是並行
即並行/併發與是不是執行緒沒關係,只和任務數/核心數有關係;如果沒有gil,多執行緒也能實現並行
(之前以為只要是多執行緒就一定是併發,即單個cpu手忙腳亂一會執行這個一下,一會又去執行那個一下;實際上,cpu的眼裡只有執行緒,所以才說執行緒是cpu排程的單位)
單執行緒/多執行緒:
**是計算密集型的,單執行緒比多執行緒快,多執行緒執行1000命令後就會被gil切換掉,而切換是要消耗資源的;
計算密集型的多工:multiprocessing建立多程序,真的多工,每個程序有各自的gil
**是io密集型的,多執行緒更快,因為有的切換,單執行緒都沒得切換,只能等
但一般程式並不是純io,也是有計算的,所以這就是協程的缺點,畢竟是單執行緒的;所以執行緒的優勢就又體現出來了
只能這麼比較通俗的講,底層還有使用者執行緒/核心執行緒什麼的 (這篇看著還不錯,基本清晰),即該開始只有程序,沒有執行緒,但程序太麻煩了,所以應用級搞了個執行緒,但核心不支援執行緒這個東西,依舊按程序來調;後來核心支援了執行緒,即調的是執行緒了
最根本的還是要看一本作業系統原理的書,才能理解透徹了
多執行緒 多程序 協程
程序 個執行的程式 就是乙個程序,沒有執行的 叫程式,程序是系統資源分配的最 小單位,程序擁有自己獨立的記憶體空間,所以程序間資料不共享,開銷大。執行緒 排程執行的最小單位 也叫執行路徑,不能獨立存在,依賴程序存在乙個程序至少有一 個 執行緒,叫主線程,而多個執行緒共享記憶體 資料共享,共享全域性變...
執行緒 程序 協程(多程序,多執行緒)
程序是程式的一次執行過程,是乙個動態概念,是程式在執行過程中分配和管理資源的基本單位,每乙個程序都有乙個自己的位址空間,至少有 5 種基本狀態,它們是 初始態,執行態,等待狀態,就緒狀態,終止狀態。執行緒是cpu排程和分派的基本單位,它可與同屬乙個程序的其他的執行緒共享程序所擁有的全部資源。協程,是...
爬蟲知識點(多程序,多執行緒 多協程)
笑虎10 個月前 python中比較常見的併發方式主要有兩種 多執行緒和多程序。當然還有協程,這裡不做介紹。1 多執行緒 多執行緒即在乙個程序中啟動多個執行緒執行任務。一般來說使用多執行緒可以達到並行的目的,但由於python中使用了全域性解釋鎖gil的概念,導致python中的多執行緒並不是並行執...