对协程的理解
對于操作系統(tǒng)來說,協(xié)程其實是一種特殊的線程,對于CPU來說,協(xié)程是非搶占式(進程和線程是搶占式的),實現(xiàn)機理如下:
有兩個function:A, B, A調(diào)用B,B要執(zhí)行一段時間,很晚才返回,A不會因為等B而一直占用CPU,即A是非阻塞的。B返回后,A又能繼續(xù)執(zhí)行。神奇的是,A和B又是走在一條獨木橋(橋上并行只能走一條線程或者進程)上的,即A和B是一體的(和線程,進程同一級別)。那么有人會問,B要執(zhí)行很久,B不就阻塞了嗎,既然AB一體,B阻塞,不就是A阻塞嗎?重要的來了:B是阻塞的,但是B并不是阻塞CPU,B阻塞的是除了CPU以外的資源,比如硬盤(慢)。所以,AB并不會阻塞CPU。這里,AB就是協(xié)程。
比較一下線程,又有兩個function:C,D,C執(zhí)行很快,D要去讀硬盤,那么如果CD一體,是一個線程,那么C一定會等D(因為線程是CPU搶占式的),那么CD就是堵塞的了。
所以,可以看到,協(xié)程適合用在多IO,比如Web后臺,每個用戶來了都要讀數(shù)據(jù)庫,我們不能讓每個用戶來到離開一直占領(lǐng)著CPU,這時候用協(xié)程就解決了。
這時,又有人說了,可以用多線程來實現(xiàn)AB啊。是可以,但是多線程就涉及到共享沖突的問題,最經(jīng)典的是生產(chǎn)者消費者模型。
?
貼來一段別人比較好的解釋:
Coroutine,翻譯成”協(xié)程“,初始碰到的人馬上就會跟進程和線程兩個概念聯(lián)系起來。直接先說區(qū)別,Coroutine是編譯器級的,Process和Thread是操作系統(tǒng)級的。Coroutine的實現(xiàn),通常是對某個語言做相應的提議,然后通過后成編譯器標準,然后編譯器廠商來實現(xiàn)該機制。Process和Thread看起來也在語言層次,但是內(nèi)生原理卻是操作系統(tǒng)先有這個東西,然后通過一定的API暴露給用戶使用,兩者在這里有不同。Process和Thread是os通過調(diào)度算法,保存當前的上下文,然后從上次暫停的地方再次開始計算,重新開始的地方不可預期,每次CPU計算的指令數(shù)量和代碼跑過的CPU時間是相關(guān)的,跑到os分配的cpu時間到達后就會被os強制掛起。Coroutine是編譯器的魔術(shù),通過插入相關(guān)的代碼使得代碼段能夠?qū)崿F(xiàn)分段式的執(zhí)行,重新開始的地方是yield關(guān)鍵字指定的,一次一定會跑到一個yield對應的地方。
---------------------
作者:純真-Cloud
來源:CSDN
原文:https://blog.csdn.net/chunzhenzyd/article/details/76270953
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!
轉(zhuǎn)載于:https://www.cnblogs.com/deepalley/p/10784054.html
總結(jié)
- 上一篇: 【sock_stream和sock_dg
- 下一篇: ZooKeeper 之快速入门