skynet 里的 coroutine
这篇讲的是 Skynet 框架如何利用 Lua 协程,将基于回调的消息处理模型,巧妙地转换为开发者更熟悉的阻塞式 RPC 调用风格。 Skynet 本身是一个消息分发器,每个服务通过一个统一的回调函数处理消息。这种异步模型虽然高效,但写起来可能不够直观。文章深入剖析了框架内部的核心技巧:为每条进入的消息创建一个协程,并让消息处理函数运行在其中。当遇到如网络请求等需要阻塞的操作时,处理函数会通过 coroutine.yield 将控制权交还框架,并附带操作类型(如“CALL”)和会话ID。框架挂起该协程,等待结果消息到达后,再根据会话ID找到并恢复对应的协程继续执行。 文章还进一步探讨了更高级的场景:如果开发者想在消息处理中自己使用协程怎么办?此时,用户协程的 yield 会被自己的 resume 捕获,导致 Skynet 的阻塞 API 失效。为此,框架提供了 skynet.coroutine 库。它在用户 yield 的类型前加上一个“USER”标记,从而与框架的内部 yield 区分开来,确保两者能协同工作而不冲突。 作者最后分享了使用协程作为迭代器的实际案例:处理一个巨大的内存操作日志文件时,通过协程实现了流式读取和转换,避免了内存溢出,展示了这一机制在实际工程中的实用价值。