區別:1、一個執行緒可以多個協程,一個行程也可以單獨擁有多個協程;2、執行緒是同步機制,而協程則是異步;3、協程能保留上一次呼叫時的狀態,執行緒不行;4、執行緒是搶佔式,協程是非搶佔式的;5、執行緒是被分割的CPU資源,協程是組織好的程式碼流程,協程需要執行緒來承載運作。
本教學操作環境:windows7系統、GO 1.18版本、Dell G3電腦。
執行緒
執行緒是指進程內的一個執行單元,也是進程內的可調度實體。執行緒是進程的一個實體,是 CPU 調度和分派的基本單位,它是比進程更小的能獨立運作的基本單位。
執行緒本身基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程式計數器,一組暫存器和堆疊),但是它可與同屬一個行程的其他的執行緒共享進程所擁有的全部資源。
線程間通訊主要透過共享內存,上下文切換很快,資源開銷較少,但相比進程不夠穩定容易丟失資料。
協程
協程是一種使用者態的輕量級線程,協程的調度完全由使用者控制。從技術的角度來說,「協程就是你可以暫停執行的函數」。協程擁有自己的暫存器上下文和堆疊。
協程調度切換時,將暫存器上下文和堆疊保存到其他地方,在切回來的時候,恢復先前保存的寄存器上下文和棧,直接操作棧則基本沒有內核切換的開銷,可以不加鎖的存取全域變量,所以上下文的切換非常快。
協程與執行緒的差異
一個執行緒可以多個協程,一個行程也可以單獨擁有多個協程。
執行緒進程都是同步機制,而協程則是異步。
協程能保留上一次呼叫時的狀態,每次過程重入時,就等於進入上一次呼叫的狀態。
線程是搶佔式,而協程是非搶佔式的,所以需要用戶自己釋放使用權來切換到其他協程,因此同一時間其實只有一個協程擁有運行權,相當於單線程的能力。
協程並不是取代線程,而且抽象於線程之上。線程是被分割的CPU 資源,協程是組織好的程式碼流程,協程需要線程來承載運行,線程是協程的資源,但協程不會直接使用線程,協程直接利用的是執行器( Interceptor),執行器可以關聯任意線程或線程池,可以使當前線程,UI線程或新建新程。
執行緒是協程的資源。協程透過 Interceptor 間接使用線程這個資源。
以上是go語言中協程與執行緒的差別是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!