coroutine和iterator随想

比如说我们要实现一个next()接口,调用者按照自己的逻辑,逐次调用这个接口,就能访问到存放在一个复杂的结构中的每一条数据。因为这个结构很复杂,在每次next()执行的时候,我们都要加载一些状态变量,来还原到上一次next()执行时的状态,从而获取到下一条数据,然后保存这些状态变量的新值。

 

当next()进入的时候,可能处于的状态越多(这往往跟你那些变量的数量和取值所产生的排列组合直接相关),这种iterator的实现就越复杂。虽然复杂,大概也有一些成熟的思路,例如尽量让next()进入的时候可能处于的状态减少(即在next()的出口前,尽量合并和转化一些状态)。

 

但是如果语言支持coroutine,这种迭代器的实现就会变得非常简单:iterator的编写者只需要写出能一口气遍历完复杂结构中每一条数据的代码即可,只是在每次获取到一条数据时,yield给外界(对外界来说相当于next()返回了)。coroutine的机制本身就自带了这些状态变量的保存和还原。

 

python的coroutine很成熟,ruby的Fibre库也带了coroutine的实现(之前的block循环其实也是某种程度上的coroutine),C++则需要使用boost::coroutine(在1.53之后出现)之类的库才可以,另外C++14大概也有了标准的coroutine库。此外用Duff's Device可以实现一个简单的stackless的coroutine,比如这里,boost::asio::coroutine算是这种的一个实现,不过大概也是较新的boost版本中才出现的。

你可能感兴趣的:(coroutine和iterator随想)