协程

协程是一种程序组件,是由子例程(过程、函数、例程、方法、子程序)的概念泛化而来的,子例程只有一个入口点且只返回一次,而协程允许多个入口点,可以在指定位置挂起和恢复执行。

  协程的概念最早由Melvin Conway在1963年提出并实现,用于简化COBOL编译器的词法和句法分析器间的协作,当时他对协程的描述是“行为与主程序相似的子例程”。

1980年Marlin的论文中给出的定义类似,也是被广为引用的协程定义:

•协程的本地数据在后续调用中始终保持

•协程在控制离开时暂停执行,当控制再次进入时只能从离开的位置继续执行

 

直到2004年由Lua的作者Ana Lucia de MouraRoberto Ierusalimschy所发表的论文《Revisiting Coroutines》中,才正式对协程进行了分类,论文中依照三个问题区分协程:

•控制传递(Control-transfer)机制

•协程是否作为语言的第一类(First-class)对象提供

•协程是否为栈式(Stackful)构造,即是否可以在内部的嵌套调用中挂起

 

       协程本质是一种控制抽象,它的价值在于可以简洁优雅地实现一些控制行为。在协程中,控制可以从当前执行上下文跳转到程序的其它位置,并且可以在之后的任意时刻恢复当前执行上下文,控制从跳出点处继续执行。这种行为与Continuation类似,但协程相比之下更容易理解,某些情况下还更加高效

 

       协程还适于实现状态机(每对入口/出口点表现一个状态),参与者模型(Actor model)(实质上也是协作式多任务)等。重要的是理解协程所表达的控制抽象,在此之上能够灵活运用的话,原本一些棘手的控制问题也许就可以简洁优雅地实现出来。

 

       如今对协程的研究和应用有重新复苏的趋势,主要集中在两个方向。一个是研究它在协作式多任务管理上相对于多线程的优势,目前以程序库和系统资源的方式提供了一些此类协程。另一个就是用于迭代器和生成器的协程,如Perl、C#、Python等。而Lua基于Revisiting Coroutines的观点,实现了完全非对称协,事实也证明了这种机制在实现一些控制结构时异常方便和强大。

posted @ 2012-03-26 16:29  许阳  阅读(529)  评论(2)    收藏  举报