1. 程式人生 > >程序,執行緒,協程的對比

程序,執行緒,協程的對比

1.程序是資源分配的單位
2.執行緒是作業系統排程的單位
3.程序切換需要的資源最大,效率低
4.執行緒切換需要的資源一般,效率一般
5.協程切換任務資源很小,效率高
6.多程序,多執行緒根據cpu核數不一樣可能是並行的,但是協程是在一個執行緒中,所以是併發

協程(coroutines),是一種比執行緒(執行緒的上下文切換?)更加輕量級的存在
正如一個程序可以擁有多個執行緒一樣,
一個執行緒也可以擁有多個協程

最重要的是,協程不是被作業系統核心所管理,
而完全是由程式所控制(yeild)(也就是在使用者態執行),
(yield 是python當中的語法。當協程執行到yield關鍵字時,
會暫停在那一行,等到主執行緒呼叫send方法傳送了資料,
協程才會接到資料繼續執行,但是,yield讓協程暫停,
和執行緒的阻塞是有本質區別的。協程的暫停完全由程式控制,
執行緒的阻塞狀態是由作業系統核心來進行切換)
這樣帶來的好處就是效能得到了很大的提升,
不會像執行緒切換那樣消耗資源

有哪些程式語言應用到了協程呢?我們舉幾個栗子:
Lua語言
Lua從5.0版本開始使用協程,通過擴充套件庫coroutine來實現。

Python語言
正如剛才所寫的程式碼示例,python可以通過 yield/send
的方式實現協程。

Go語言
Go語言對協程的實現非常強大而簡潔,
可以輕鬆建立成百上千個協程併發執行。

Java語言
如上文所說,Java語言並沒有對協程的原生支援,
但是某些開源框架模擬出了協程的功能,有興趣的小夥伴可以看一看Kilim框架的原始碼:
https://github.com/kilim/kilim