差别
这里会显示出您选择的修订版和当前版本之间的差别。
| 两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
| manual:reference:grammar:function:main_page [2021/07/02 16:30] – [6.1 定义] rend | manual:reference:grammar:function:main_page [2023/03/23 17:16] (当前版本) – mikecovlee | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| ====== Covariant Script 函数 ====== | ====== Covariant Script 函数 ====== | ||
| - | ----- | ||
| - | \\ | ||
| - | |||
| ===== 6.1 定义 ===== | ===== 6.1 定义 ===== | ||
| 行 45: | 行 42: | ||
| 可变参数函数被调用时,可变参数列表会被以数组的形式呈现,若需要二次转发可使用展开运算符'' | 可变参数函数被调用时,可变参数列表会被以数组的形式呈现,若需要二次转发可使用展开运算符'' | ||
| + | ===== 6.3 协程(Coroutine) ===== | ||
| + | |||
| + | // | ||
| + | |||
| + | CovScript 函数可以转换为协程(Coroutine) | ||
| + | |||
| + | {{: | ||
| + | |||
| + | 相对于线程(Thread),多个协程不会同时运行,仅在单个线程内进行函数执行上下文的切换,从而实现了并发编程 | ||
| + | |||
| + | 更进一步说,线程是由调度器进行**抢占式调度**,在多 CPU 系统中会**并行**执行; | ||
| + | |||
| + | 而协程是主动**让出(yield)**时间片,仅运行在单个 CPU 核心上,属于**协作式调度** | ||
| + | |||
| + | CovScript 协程是**堆栈式非对称协程(Stackful Asymmetric Coroutine)**: | ||
| + | * 堆栈式意味着每个协程都拥有独立的栈,并会随着协程切换而一同切换 | ||
| + | * 非对称式意味着语言运行时不会对协程进行主动调度,需要由协程主动进行调度 | ||
| + | |||
| + | <code matlab> | ||
| + | function co_func() | ||
| + | system.out.println(" | ||
| + | context.yield() | ||
| + | system.out.println(" | ||
| + | end | ||
| + | var co = context.create_co(co_func) | ||
| + | system.out.println(" | ||
| + | context.resume(co) | ||
| + | system.out.println(" | ||
| + | context.resume(co) | ||
| + | </ | ||
| + | |||
| + | 这是一个简单的示例,命令行会依次输出: | ||
| + | |||
| + | <code bash> | ||
| + | Launch coroutine | ||
| + | Coroutine started | ||
| + | Resume coroutine | ||
| + | Coroutine resumed | ||
| + | </ | ||
| + | |||
| + | 更多协程相关的 API 可参考 [[manual: | ||