協(xié)程
協(xié)程
1. 協(xié)程介紹
協(xié)程又稱微線程,從名字可以看出,協(xié)程的粒度比線程更小,并且是用戶管理和控制的,多個(gè)協(xié)程可以運(yùn)行在一個(gè)線程上面。那么協(xié)程出現(xiàn)的背景又是什么呢,先來看一下目前線程中影響性能的特性:
- 使用鎖機(jī)制
- 線程間的上下文切換
- 線程運(yùn)行和阻塞狀態(tài)的切換
以上任意一點(diǎn)都是很消耗cpu性能的。相對來說協(xié)程是由程序自身控制,沒有線程切換的開銷,且不需要鎖機(jī)制,因?yàn)樵谕粋€(gè)線程中運(yùn)行,不存在同時(shí)寫變量沖突,在協(xié)程中操作共享資源不加鎖,只需要判斷狀態(tài)就行了,所以執(zhí)行效率比線程高的多。
2. 主流語言對協(xié)程的支持
Lua語言
Lua從5.0版本開始使用協(xié)程,通過擴(kuò)展庫coroutine來實(shí)現(xiàn)。
Python語言
python可以通過 yield/send 的方式實(shí)現(xiàn)協(xié)程。在python 3.5以后,async/await 成為了更好的替代方案。
Go語言
Go語言對協(xié)程的實(shí)現(xiàn)非常強(qiáng)大而簡潔,可以輕松創(chuàng)建成百上千個(gè)協(xié)程并發(fā)執(zhí)行。
Java語言
如上文所說,Java語言并沒有對協(xié)程的原生支持,但是某些開源框架模擬出了協(xié)程的功能,有興趣的小伙伴可以看一看Kilim框架的源碼:
https://github.com/kilim/kilim
C/C++
c/c++需要自己借助ucontext、setjmp、longjmp庫實(shí)現(xiàn),微信開源了c/c++的協(xié)程庫libco。
浙公網(wǎng)安備 33010602011771號