使用Lua的生产者-消费者模式,消费者等待不同的数据。

问题

  • 一个数据源生成 {key, value} 格式的数据
  • 多个接收器每个接收器等待不同的键

示例

获取数据在循环中运行。有时,我想使用以下方式获取下一个带有键标签的值:

Value = MyClass:GetNextValue(Key)

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

因此,我想问的问题类似于 如何使用协程或类似的概念(无需线程)在 Lua 中实现异步值?

附注

除了将值返回给等待的消费者之外,主处理函数还将处理某些即将到来的数据(例如,标有特殊键)。

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

-- 在循环中
    ReceiveData()
    ProcessSpecialData()
--

-- 在循环外调用:
V = RequestDataWithGivenKey(Key)

原文链接 https://stackoverflow.com/questions/10673196

点赞
stackoverflow用户734069
stackoverflow用户734069

如何实现异步值

首先,不是实现异步 ,而是实现异步 函数 :只有在数据被检索之后,才能获取该值。

首先,你的代码必须处于Lua协程中。我假设你了解协程的一切。我将重点介绍如何实现RequestDataWithGivenKey

function RequestDataWithGivenKey(key)
  local request = FunctionThatStartsAsyncGetting(key)
  if(not request:IsComplete()) then
    coroutine.yield()
  end

  --获取完成。返回该值。
  return request:GetReturnedValue()
end

FunctionThatStartsAsyncGetting返回一个request给该函数。request是一个对象,存储处理特定请求所需的所有数据。它表示请求该值。这应该是一个启动实际异步获取的C函数。

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

你的外部代码只需要在内部处理异步数据。在这些Lua协程的回复之间,如果有未完成的请求,你需要推动获取数据的异步处理。

2012-05-20 12:31:17