前言
提到lua,就不得不提协程coroutine。coroutine是lua的一种内在机制,为lua提供了原生的异步支持。从用户层面来看,用户不需关心coroutine的内在实现,而只需要用coroutine调度function即可,因此非常方便。
对于一个function而言,coroutine可以将function的代码分片,使得一个function可以分阶段运行。在实现上,function的状态管理会与CPU的机制相似。如果把一个function当做一个任务来看待的话,在coroutine的封装下,这个任务会被分解成多个阶段的子任务。这样,我们就可以把多个任务的子任务相互协调调度,实现更加灵活的功能交互。
因此,本期Lua杂谈,就来小试一抔coroutine的使用吧。
coroutine的基本用法
官方5.3.5版本的coroutine库,提供了如下的接口:
1 | // lcorolib.c |
用户可以通过coroutine.wrap与coroutine.create两种方式封装一个function(任务)。通过wrap封装任务会返回一个纯粹的lua函数(type为function),而用create封装则返回的是一个封装好的线程。
在Lua中,线程thread与协程coroutine的概念内涵有较多相似之处,但我们可以认为,线程是更加宏观广泛的概念,协程则是一种特殊的线程。线程强调的不同的routine之间运行是否独立;而协程强调的则是不同routine之间具有相互co的协作功能。
基于这两种方式调度任务的代码写法大同小异。以下以create封装任务为例,我们一起看看会是怎样的进行——