為什麼無棧協程不能被非協程函式巢狀呼叫?

時間 2021-12-29 20:00:16

1樓:Ethan Lv

思考了下,發現我在幾個小時前提出這個問題的時候,對 stackful 和 stackless 的理解是不太到位的,當然現在也依然不太到位。

只能簡單說下我的認知了。

首先,我們給協程的簡單定義是:

其區域性變數能夠保持或者說恢復。

resume 時能夠跳轉回離開時的那條語句。

對於 async/await 和有棧協程的區別 原子筆 說的太好了:它是們在 」跳轉離開「 這一行為上選用了兩種方法。前者是函式返回,後者是呼叫乙個新的函式。

async/await非同步模型是否優於stackful coroutine模型? - 原子筆的回答 - 知乎 https://www.

再回到協程宣告是否能在巢狀詞法結構中呼叫的問題。

設想一下,我們呼叫了乙個 coroutine c,當它呼叫了常規例程 f 時,f 的呼叫幀要去哪呢?如果對 f() 的呼叫導致另乙個協程掛起,那麼f()本身的呼叫幀必須和 c() 的幀一起儲存。

基於 stackful 的協程方案,我們是可以做到這一點的,但是還是會帶來不小的複雜性。 因此,不少語言的有棧協程也對其做了限制,要求協程只能宣告在詞法巢狀的最外層。

而 stackless 的方案如 靈劍 所說可以理解為乙個狀態機、閉包或者物件模型,也就是說協程 suspend 的時候根本就沒有常規的呼叫棧結構,要實現巢狀呼叫怎麼整呢。。。。很難

為什麼 Java 堅持多執行緒不選擇協程?

Xpecya 最直接的原因我認為是jdbc 協程你想跑滿單核心首先你得非阻塞。但是對於實際專案而言,只要你需要從資料庫獲取資料,就必須用乙個把單執行緒徹底堵死的jdbc api 所以如果現在jdk推出協程,你也只能在不需要jdbc呼叫的場合才能玩玩。而這 真的沒什麼意思。如果真的要搞協程,首先請推出...

為什麼協程切換的代價比執行緒切換低

艦長 我覺得這個問題得換個問法,結合實際使用場景 協程一般拿來撐併發用,也就是說大部分情況下系統執行的協程數量遠大於核數,在沒有協程的年代用生產者消費者模式,乙個協程相當於那個模式中的乙個task的概念,只是資料儲存在了棧上。這樣兩個模式對比是有意義的,在bthread的M N模型中,協程也有佇列的...

AirPods Pro為什麼不能控制抗噪程度,是否存在技術難題?

Mikan 調節降噪強度的功能,我是用sony耳機時,這個功能沒有用過一次。如果長時間使用主動降噪耳機就會知道,主動降噪耳機只有兩種模式 關閉降噪和開啟降噪 AirPods Pro為什麼好,因為蘋果把這兩種模式改成了 可用且好用的環境音模式和降噪模式 而且減少或增加降噪強度,對耳壓等舒適度並不是一成...