聽(tīng)說(shuō)過(guò)python協(xié)程沒(méi)?聽(tīng)說(shuō)過(guò) asyncio 庫(kù)沒(méi)?都在這一篇博客了">聽(tīng)說(shuō)過(guò)python協(xié)程沒(méi)?聽(tīng)說(shuō)過(guò) asyncio 庫(kù)沒(méi)?都在這一篇博客了
710
2025-04-03
由于工作原因調(diào)查了,協(xié)程和線程相關(guān)的知識(shí)
簡(jiǎn)介:
協(xié)程更適合于用來(lái)實(shí)現(xiàn)彼此熟悉的程序組件,如合作式多任務(wù),迭代器,無(wú)限列表和管道。 協(xié)程最初在1963年被提出。
協(xié)程不是進(jìn)程或線程,其執(zhí)行過(guò)程更類似于子例程,或者說(shuō)不帶返回值的函數(shù)調(diào)用。
一個(gè)程序可以包含多個(gè)協(xié)程,可以對(duì)比與一個(gè)進(jìn)程包含多個(gè)線程,因而下面我們來(lái)比較協(xié)程和線程。我們知道多個(gè)線程相對(duì)獨(dú)立,有自己的上下文,切換受系統(tǒng)控制;而協(xié)程也相對(duì)獨(dú)立,有自己的上下文,但是其切換由自己控制,由當(dāng)前協(xié)程切換到其他協(xié)程由當(dāng)前協(xié)程來(lái)控制。
知乎:
一開(kāi)始大家想要同一時(shí)間執(zhí)行那么三五個(gè)程序,大家能一塊跑一跑。特別是UI什么的,別一上計(jì)算量比較大的玩意就跟死機(jī)一樣。于是就有了
并發(fā)
,從程序員的角度可以看成是多個(gè)獨(dú)立的邏輯流。內(nèi)部可以是多cpu并行,也可以是單cpu時(shí)間分片,能快速的切換邏輯流,看起來(lái)像是大家一塊跑的就行。
但是一塊跑就有問(wèn)題了。我計(jì)算到一半,剛把多次方程解到最后一步,你突然插進(jìn)來(lái),我的中間狀態(tài)咋辦,我用來(lái)儲(chǔ)存的內(nèi)存被你覆蓋了咋辦?所以跑在一個(gè)cpu里面的并發(fā)都需要處理上下文切換的問(wèn)題。
進(jìn)程
就是這樣抽象出來(lái)個(gè)一個(gè)概念,搭配虛擬內(nèi)存、進(jìn)程表之類的東西,用來(lái)管理獨(dú)立的程序運(yùn)行、切換。
后來(lái)一電腦上有了好幾個(gè)cpu,好咧,大家都別閑著,一人跑一進(jìn)程。就是所謂的
并行
。
因?yàn)槌绦虻氖褂蒙婕按罅康挠?jì)算機(jī)資源配置,把這活隨意的交給用戶程序,非常容易讓整個(gè)系統(tǒng)分分鐘被搞跪,資源分配也很難做到相對(duì)的公平。所以核心的操作需要陷入內(nèi)核(kernel),切換到操作系統(tǒng),讓老大幫你來(lái)做。
有的時(shí)候碰著I/O訪問(wèn),阻塞了后面所有的計(jì)算??罩彩强罩?,老大就直接把CPU切換到其他進(jìn)程,讓人家先用著。當(dāng)然除了I\O阻塞,還有時(shí)鐘阻塞等等。一開(kāi)始大家都這樣弄,后來(lái)發(fā)現(xiàn)不成,太慢了。為啥呀,一切換進(jìn)程得反復(fù)進(jìn)入內(nèi)核,置換掉一大堆狀態(tài)。進(jìn)程數(shù)一高,大部分系統(tǒng)資源就被進(jìn)程切換給吃掉了。后來(lái)搞出
線程
的概念,大致意思就是,這個(gè)地方阻塞了,但我還有其他地方的邏輯流可以計(jì)算,這些邏輯流是共享一個(gè)地址空間的,不用特別麻煩的切換頁(yè)表、刷新TLB,只要把寄存器刷新一遍就行,能比切換進(jìn)程開(kāi)銷少點(diǎn)。
如果連時(shí)鐘阻塞、 線程切換這些功能我們都不需要了,自己在進(jìn)程里面寫一個(gè)邏輯流調(diào)度的東西。那么我們即可以利用到并發(fā)優(yōu)勢(shì),又可以避免反復(fù)系統(tǒng)調(diào)用,還有進(jìn)程切換造成的開(kāi)銷,分分鐘給你上幾千個(gè)邏輯流不費(fèi)力。這就是
用戶態(tài)線程
。
從上面可以看到,實(shí)現(xiàn)一個(gè)用戶態(tài)線程有兩個(gè)必須要處理的問(wèn)題:一是碰著阻塞式I\O會(huì)導(dǎo)致整個(gè)進(jìn)程被掛起;二是由于缺乏時(shí)鐘阻塞,進(jìn)程需要自己擁有調(diào)度線程的能力。如果一種實(shí)現(xiàn)使得每個(gè)線程需要自己通過(guò)調(diào)用某個(gè)方法,主動(dòng)交出控制權(quán)。那么我們就稱這種用戶態(tài)線程是協(xié)作式的,即是
協(xié)程
。
摘自:
https://www.zhihu.com/question/20511233/answer/24260355
本質(zhì)上協(xié)程就是用戶空間下的線程。用圖來(lái)說(shuō)明一下
QQ群大佬發(fā)的圖:
協(xié)程切換由 用戶來(lái)控制,不占用cpu。
任務(wù)調(diào)度
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。