协程就是goto吗?两者有何异同?
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
goto是在同一個函數中跳轉,協程應該類似於setjump和longjump,這個是在不同函數間跳躍。
setjump
longjump
這麼說不準確,應該說協程一個主要功能就是跨函數的goto,當然,在需要時還能goto回來,這一點更像函數呼叫。
協程是一種電腦程式設計的元件,它範化了子程式的概念.協程非常適合用於實現一些有用的程式元件例如,協作式多任務,異常處理,事件循環,迭代器,無限鍊錶和管道等.
下面比較一般的子程式和協程:
子程式的起始處是惟一的入口點,一旦退出即完成了子程式的執行,子程式的一個實例只會回傳一次。
子程序總是在它的開始處被啟動,它通常是一個固定的位置.共行程序總是在它上次結束處的下一位置被啟動.
協程可以透過yield來呼叫其它協程。透過yield方式轉移執行權的協程之間不是呼叫者與被呼叫者的關係,而是彼此對稱、平等的。
子程式容易實作於堆疊之上,因為子程式將呼叫的其他子程式作為下級。相反地,協程對等地呼叫其他協程,最好的實作是用 continuations(由有垃圾回收的堆實現)以追蹤控制流程。
Marlin對coroutine的特性描述如下:
coroutine中的局部變數在後續呼叫中保持有效.
當控制離開的時候coroutine被掛起,將控制權交還給它的時候在它掛起的地方繼續執行.
協程的分類
1)透過控制轉移機制分類:對稱協程與非對稱協程
非對稱協程(asymmetric),或稱為半對稱協程(semi-symmetric)或半協程(semi-coroutines).非對稱協程可以被看作是調用者的從屬過程,它們之間的關係跟呼叫和被呼叫例程的關係類似.
對稱協程只提供了一種控制轉移機制:將執行流程交給指定的協程.因為對稱協程之間可以互相轉移執行流程,所以它們之間的關係就像在同一個層級.
2) 協程是否為一級類型(first-class)
3) 是否有完整的堆疊
有完整堆疊的協程,允許協程在最內層的函數中掛起自己.以後此協程被resume將會從它被掛起的 地方繼續執行.
沒有完整堆疊的協程,例如python的generator,則只能在generator的主body中被掛起.
有完整堆疊的協程可以用來實現使用者級多任務而沒有完整堆疊的協程則不行.
協程的關鍵字是yield,個人覺得意義應該是: 中斷執行,返回資料.再次呼叫,回到斷點,恢復執行. yield 等價於 return 且 goto breakpoint.
goto是在同一個函數中跳轉,協程應該類似於
setjump
和longjump
,這個是在不同函數間跳躍。這麼說不準確,應該說協程一個主要功能就是跨函數的goto,當然,在需要時還能goto回來,這一點更像函數呼叫。
協程是一種電腦程式設計的元件,它範化了子程式的概念.協程非常適合用於實現一些有用的程式元件例如,協作式多任務,異常處理,事件循環,迭代器,無限鍊錶和管道等.
下面比較一般的子程式和協程:
子程式的起始處是惟一的入口點,一旦退出即完成了子程式的執行,子程式的一個實例只會回傳一次。
子程序總是在它的開始處被啟動,它通常是一個固定的位置.共行程序總是在它上次結束處的下一位置被啟動.
協程可以透過yield來呼叫其它協程。透過yield方式轉移執行權的協程之間不是呼叫者與被呼叫者的關係,而是彼此對稱、平等的。
子程式容易實作於堆疊之上,因為子程式將呼叫的其他子程式作為下級。相反地,協程對等地呼叫其他協程,最好的實作是用 continuations(由有垃圾回收的堆實現)以追蹤控制流程。
Marlin對coroutine的特性描述如下:
coroutine中的局部變數在後續呼叫中保持有效.
當控制離開的時候coroutine被掛起,將控制權交還給它的時候在它掛起的地方繼續執行.
協程的分類
1)透過控制轉移機制分類:對稱協程與非對稱協程
非對稱協程(asymmetric),或稱為半對稱協程(semi-symmetric)或半協程(semi-coroutines).非對稱協程可以被看作是調用者的從屬過程,它們之間的關係跟呼叫和被呼叫例程的關係類似.
對稱協程只提供了一種控制轉移機制:將執行流程交給指定的協程.因為對稱協程之間可以互相轉移執行流程,所以它們之間的關係就像在同一個層級.
2) 協程是否為一級類型(first-class)
3) 是否有完整的堆疊
有完整堆疊的協程,允許協程在最內層的函數中掛起自己.以後此協程被resume將會從它被掛起的 地方繼續執行.
沒有完整堆疊的協程,例如python的generator,則只能在generator的主body中被掛起.
有完整堆疊的協程可以用來實現使用者級多任務而沒有完整堆疊的協程則不行.
協程的關鍵字是yield,個人覺得意義應該是:
中斷執行,返回資料.再次呼叫,回到斷點,恢復執行.
yield 等價於 return 且 goto breakpoint.