上一篇說了coroutine的本質是什麼,就是resumable function,那麼一個函數有了suspend和resume功能以後,會打開什麼樣的新世界大門呢?隨便舉幾個例子。html
其實,2和3的機制是很類似的,只不過2裏面喚醒coroutine的是操做系統的callback,3是你本身的另外一個線程。4裏面說的異常,其實就是這樣的,由於異常和coroutine再往下追溯,他們的理論基礎都是CPS(Continuation Passing Style),也就是把當前操做的後續操做做爲閉包傳給當前操做,而當前操做能夠選擇執行哪個(或是否執行)後續操做。雖然coroutine和exception都用到了CPS,但大部分的coroutine都額外支持了exception,耦合在了一塊兒,由於他們沒有直接提供操做continuation的東西。程序員
扯遠了,能夠看到了,coroutine解鎖了不少寫代碼的新姿式。多線程
有了generator,你能夠生成一個惰性求值的列表,對他進行變換,而這些全部的操做都是惰性執行的,這就是C#裏面的LINQ,Python和Javascirpt裏的生成器,Java8的Stream API,C++的range-ts也能夠接入coroutine,而避免使用複雜的迭代器封裝狀態。閉包
有了async-await,你能夠把異步代碼寫成像同步代碼那樣,而代碼在await的邊界處是自動暫停和繼續的,這無疑下降了程序員手動寫狀態機維護狀態的難度,也避免了一連串.then形成回調地獄的問題。channel和異步操做的async-await很類似,兩條線程現在能夠主動的暫停本身和喚醒對方,經過一個普通的原子變量來傳遞信息,而不須要用厚重的管道或者多線程同步機制來等待和喚醒對方。異步
關於coroutine模擬exception,這卻是沒有太大的必要,不過,考慮到coroutine的本質是CPS,那麼就能夠用coroutine來模擬rust的自動向上傳播錯誤碼,haskell的maybe monad等等,這些東西是對應語言的錯誤處理機制,就像C++的異常同樣。async
腦洞,反過來,異常能夠模擬coroutine嗎?不行,異常有點像暫停以後不再會喚醒的coroutine。函數