Lua生产者 - 消费者模式与消费者等待不同的数据

时间:2012-05-20 11:58:36

标签: asynchronous io lua producer-consumer

问题

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

示例

获取数据循环运行。有时我会希望通过使用

获得用键标记的下一个值
Value = MyClass:GetNextValue(Key)

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

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

旁注

主要处理功能除了向等待的消费者返回值外,还会处理一些传入数据(例如,用特殊键标记)本身。

完整的使用情况应该类似于:

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

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

1 个答案:

答案 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

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

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

您的外部代码只需要在内部处理异步内容。在这些Lua协同程序的简历之间,如果有未完成的请求,你需要抽取任何异步内容正在进行提取。

相关问题