Asynchronous 使用协程重构Lua中的阻塞I/O

Asynchronous 使用协程重构Lua中的阻塞I/O,asynchronous,lua,io,coroutine,Asynchronous,Lua,Io,Coroutine,假设我有下面的Lua代码,它从文件中读取和解析数据 local cjson=需要“cjson” 函数读取数据(路径) 本地文件=io.open(路径“r”) 本地raw=file.read('*all') 返回cjson.decode(原始) 结束 函数使用_数据(路径) 本地数据=读取数据(路径) --用数据做点什么` 结束 我现在试图弄清楚这个基本示例的非阻塞版本是什么样子的 在Javascript中,您可以使这两个函数都异步,然后等待结果。但是从我到目前为止读到的关于Lua的内容来看,这

假设我有下面的Lua代码,它从文件中读取和解析数据

local cjson=需要“cjson”
函数读取数据(路径)
本地文件=io.open(路径“r”)
本地raw=file.read('*all')
返回cjson.decode(原始)
结束
函数使用_数据(路径)
本地数据=读取数据(路径)
--用数据做点什么`
结束
我现在试图弄清楚这个基本示例的非阻塞版本是什么样子的

在Javascript中,您可以使这两个函数都异步,然后等待结果。但是从我到目前为止读到的关于Lua的内容来看,这里我只需要重构
read\u data
函数来使用协同程序,我可以让
use\u data
代码保持原样。我将如何实现这一点


编辑:欢迎使用外部库替换当前调用的解决方案。基本上,使示例无阻塞所需的一切。

file.read()
cjson.decode()
都是阻塞调用。您可以通过协同程序延迟它们,但不能“避免阻塞I/O”。
coroutine.resume()。在这种情况下,问题变成了(1)对于这个特定示例,什么是最佳选择;(2)在选择替代I/O库时,是否有一些一般原则可以帮助您进行选择?签出和luvi;它将libuv添加到lua(异步函数)中。默认情况下,Lua构建为只有一个线程(因此在所有调用中都会阻塞),因此在纯Lua中这样做几乎是不可能的。