[√]lua 协程

简介: [√]lua 协程

栈式协程(Stackful coroutine)是一种实现并发编程的技术,它允许在程序中使用类似线程的方式来处理异步任务,但是没有线程切换的开销。在传统的线程或进程模型中,每个任务都有自己的独立堆栈和上下文,而在协程模型中,多个协程可以共享同一个堆栈。

与无栈(stackless)协程不同,栈式协程将其状态保存在独立的堆栈中,允许暂停和恢复执行。这种设计使得栈式协程更像是轻量级线程,能够实现更加细粒度的并发控制。当一个协程遇到阻塞操作时,可以将自己的执行状态保存到堆栈中,然后切换到其他可执行的协程,从而提高系统的并发性能。

栈式协程的实现依赖于编程语言和运行时环境的支持。在许多语言中,例如Python的 asyncio、C#的 async/await等,栈式协程已经成为异步编程的重要组成部分。通过使用栈式协程,开发人员可以编写更加简洁和易于理解的异步代码,同时充分利用计算资源,提高程序的性能和可伸缩性。

需要注意的是,栈式协程并不是在所有情况下都是最佳选择。它适用于那些需要管理大量I/O密集型任务的场景,但在CPU密集型任务或需要多核并行处理的情况下,传统的线程或进程模型可能更加适合。在选择使用栈式协程还是其他并发模型时,需要根据具体的应用需求和性能要求做出权衡。

什么是 Coroutine?

Coroutine 可以被翻译为协程,它与 Subroutine(子程序)有什么区别呢?其实我们绝大多数接触到的函数也好,方法也好,都是 Subroutine 的一种,它的特点就是,子程序从函数入口开始,一直到 return 语句结束,也就是说,一旦子程序返回了,它这一阶段的所有使命就完成了。

而 Coroutine 是一种可以与其他 Coroutine 或 Subroutine 交叉运行的程序,这也是为什么 Coroutine 叫做 Coroutine 的原因了,一般来讲,一段 Coroutine 也会存在一个返回语句(通常叫做 yield),一旦执行到此语句,Coroutine 就会保存上下文并且将控制权交出(睡眠),此时调用这段 Coroutine 的 whatever-routine 就会『拿到 CPU 的控制权』,并且得到 yield 出来的变量,一旦时机成熟,刚才睡眠的 Coroutine 就又可以原地复苏,从刚才暂停下来的 yield 语句继续向下执行,直到 return 才彻底结束。

-- 创建一个新的协程
local co = coroutine.create(function()
    print("协程开始")
    local value = coroutine.yield("协程暂停")
    print("协程恢复", value)
end)
print("主程序执行")
-- 启动协程并传递数据
local status, result = coroutine.resume(co)
print("协程状态:", status)
print("协程结果:", result)
-- 继续执行协程并传递数据
status, result = coroutine.resume(co, 42)
print("协程状态:", status)
print("协程结果:", result)

执行结果

主程序执行
协程开始
协程状态: true
协程结果: 协程暂停
协程恢复    42
协程状态: true
协程结果: nil


目录
相关文章
|
3月前
Lua语法(四)——协程
Lua语法(四)——协程
41 0
【Lua】协程(Coroutine)
【Lua】协程(Coroutine)
99 0
lua语言——协同程序(协程)
lua语言——协同程序(协程)
135 0
Lua协同程序(协程)
Lua协同程序(协程)
330 0
Lua协同程序(协程)
|
应用服务中间件
LUA 协程 Coroutine
协程 Coroutine 协程(coroutine)并不是 Lua 独有的概念,如果让我用一句话概括,那么大概就是:一种能够在运行途中主动中断,并且能够从中断处恢复运行的特殊函数。(嗯,其实不是函数。
2547 0
|
机器学习/深度学习 人工智能
Lua 协程coroutine
  协程和一般多线程的区别是,一般多线程由系统决定该哪个线程执行,是抢占式的,而协程是由每个线程自己决定自己什么时候不执行,并把执行权主动交给下一个线程。 协程是用户空间线程,操作系统其存在一无所知,所以需要用户自己去做调度,用来执行协作式多任务非常合适。
1496 0
|
关系型数据库 MySQL C++
利用LUA协程实现FUTURE模式
1. Future模式: 参见http://www.cnblogs.com/zhiranok/archive/2011/03/26/Future_Pattern.html 使用future的好处是即利用了异步的并行能力,又保证主逻辑串行执行,保持简单。
1251 0