0

问题

  • 一个数据源以格式生成数据{key, value}
  • 多个接收者各自等待不同的密钥

例子

获取数据是循环运行的。有时我会想通过使用来获得下一个用键标记的值

Value = MyClass:GetNextValue(Key)

我希望我的代码停在那里,直到值准备好(产生某种未来(?)值)。我尝试过使用简单的协程,但它们仅在等待任何数据时才起作用。

所以我想问的问题是如何使用协程或类似概念(无线程)在 lua 中实现异步值?

旁注

主处理函数除了将值返回给等待的消费者外,还会自己处理一些传入的数据(例如,用特殊键标记)。

完整的使用上下文应该类似于:

-- in loop
    ReceiveData()
    ProcessSpecialData()
--

-- Called outside the loop:
V = RequestDataWithGivenKey(Key)
4

1 回答 1

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将是一个用户数据或一个封装的 Lua 表,它存储足够的信息以与执行异步获取的 C 代码进行通信。IsComplete使用内部request数据查看该请求是否已完成。GetReturnedValue只能在IsComplete返回 true 时调用;它将值放在 Lua 堆栈上,以便该函数可以返回它。

您的外部代码只需要在内部处理异步内容。在这些 Lua 协程的恢复之间,如果有未完成的请求,您将需要泵送正在执行获取的任何异步内容。

于 2012-05-20T12:31:17.470 回答