协程的初步理解
这两天在网上看协程相关的知识,今天终于有了一个大概的理解。下面给出一个介绍:
协程(coroutine)和例程(routine)
在讨论协程时,往往把这个概念和例程做对比。例程就是我们通常意义下的函数。
例程和协程的区别在于:当调用者调用被调用者时,如果是例程,只有当被调用者执行完毕后才能返回调用者;如果是协程,被调用者可以执行到一半就挂起并返回到调用者,同时,被调用者可以再次从挂起的地方重新执行。
把协程和例程看作一个类
为了更好的理解协程和例程,基于面向对象的思想,我们把协程和例程都看作一个类。例如,一个例程可以是做一个类F
(事实上,就像仿函数那样),每次执行函数可以理解为:
F f;
f.run();
也就是说,每次执行函数,都相当于定义一个类的实例并执行它。
基于我们上面讨论的区别,对于例程而言,只有当被调用者执行完毕后才能返回调用者。所以当f
执行完成后就自动销毁了,不存在任何中间状态,f
这个实例的状态不会影响执行结果。所以,对于例程而言,run()
函数是一个静态成员函数,可以直接写作F::run()
。但是对于协程而言,一个协程可以执行到一半就返回调用者,下次再继续执行,也就是说,可以:
<