存档

文章标签 ‘coroutine’

说说一个新的老概念coroutine

2008年8月18日 4 条评论

因为最近的工作当中频繁地用到了异步的IO编程模型,对于异步模型的难于维护性深感切肤之痛。工作之余便在考虑有没有什么方法可以使这种模型变得更加的易读易写和易维护,有一个想法很自然的产生了,就是用我们熟悉的流程化的方法来做写处理流程,然后在一些IO触发点上异步化,也就是触发一个异步IO请求,将当前的执行状态换出,换入另一个执行状态,直到IO请求结束,该执行状态被再次换入,则继续执行。

后来去搜索相关的问题,发现其实这个是一个很老的想法了。在计算机科学当中,这个术语叫做Coroutine,最早提出是在1969年,而在早期的高级语言lisp和schema当中就有实现。如果把Coroutine和函数进行比较的话,函数只有一个入口点,而Coroutine可以有多个入口点。当Coroutine被第一次调用到的时候,它将从起始处开始执行,一旦遇到具有yield语义的语句的时候,就是返回给另外一个Coroutine或者调用者,而在接下来被调用的时候,就从yield语句下面的一条语句继续执行直到遇到新的yield语句或者Coroutine的结束。

如果了解Python,其实Python当中的Generator就是一种Coroutine。比如

def xrange(start, end):
    val = start;
    while ( val < start ):
       yield val
       val += 1

除了Python,Stackless-Python和.NET也有相应的实现,而C/C++虽然有一些实现,但是通用性都不太好,因为实现难度相对比较大,毕竟Coroutine完全颠覆了C/C++基于stack的函数调用模型。

下面大体上看一下Coroutine的几个C实现,下次再写。

标签: ,