差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

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