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