问题
{key, value}
示例
获取数据循环运行。有时我会希望通过使用
获得用键标记的下一个值Value = MyClass:GetNextValue(Key)
我希望我的代码停在那里,直到值准备好(制作某种未来(?)值)。我尝试过使用简单的协同程序,但它们仅在等待任何数据时才有效。
所以我想问的问题是如何使用协同程序或类似概念(没有线程)在lua中实现异步值?
旁注
主要处理功能除了向等待的消费者返回值外,还会处理一些传入数据(例如,用特殊键标记)本身。
完整的使用情况应该类似于:
-- in loop
ReceiveData()
ProcessSpecialData()
--
-- Called outside the loop:
V = RequestDataWithGivenKey(Key)
答案 0 :(得分:2)
如何实现异步值
首先,不要实现异步值。您实现了异步函数:在检索之前不会获取值。
首先,您的代码必须是Lua协程。我假设你了解协同程序的护理和喂养。我将重点介绍如何实施RequestDataWithGivenKey
:
function RequestDataWithGivenKey(key)
local request = FunctionThatStartsAsyncGetting(key)
if(not request:IsComplete()) then
coroutine.yield()
end
--Request is complete. Return the value.
return request:GetReturnedValue()
end
FunctionThatStartsAsyncGetting
将request
返回给该函数。 request
是一个对象,用于存储处理特定请求的所有数据。它代表了要求的价值。这应该是一个启动实际异步获取的C函数。
request
将是userdata或封装的Lua表,它存储足够的信息以与正在执行异步提取的C代码进行通信。 IsComplete
使用内部request
数据来查看该请求是否已完成。 GetReturnedValue
只能在IsComplete
返回true时调用;它将值放在Lua堆栈上,以便该函数可以返回它。
您的外部代码只需要在内部处理异步内容。在这些Lua协同程序的简历之间,如果有未完成的请求,你需要抽取任何异步内容正在进行提取。