暂停之后还能从原处继续
普通函数调用通常一直执行到返回,调用者才取得结果。协程可以在中途暂停,保留局部变量与执行位置,等以后恢复时继续工作。例如一个生产数据的过程可以每次生成一项就让出控制,而使用者按需要恢复它,不必预先把全部结果放进一个巨大集合。
让出与恢复构成协作
Lua通过创建操作建立协程,用resume启动或继续执行,再用yield显式暂停。创建并不等于已经运行,暂停也不等于函数已经永久结束。这种合作式安排使切换位置出现在程序规定的地方;它与操作系统可以随时抢占一个线程的调度方式,不是同一层面的控制规则。
参考:[1]
恢复时也可以传入信息
协程间的交接不只传出数据。Lua允许恢复时传入值,Python的PEP 342也给生成器加入send等机制,使暂停位置能够接收新输入,并处理异常与关闭。生成器因此可以参与更丰富的控制流程,但不同语言对能否跨调用层暂停、如何清理资源等问题,仍有各自约定。
调度与并行还需另行安排
协程可以帮助组织流水线、等待与异步处理,但谁先恢复、同时保留多少任务、何时取消,仍要由程序或运行框架安排。一个协程若长时间执行而不让出,其他依赖同一调度线程的活动可能无法推进;它若调用阻塞操作,也不会仅因使用协程就自动变成非阻塞。