0

問題

  • フォーマットでデータを生成する1つのデータソース{key, value}
  • それぞれが異なるキーを待機している複数のレシーバー

データの取得はループで実行されます。時々私は使用することによってキーでラベル付けされた次の値を取得したいでしょう

Value = MyClass:GetNextValue(Key)

値の準備ができるまでコードを停止させたい(ある種のfuture(?)値を作成する)。単純なコルーチンを使用してみましたが、データを待機している場合にのみ機能します。

だから私が聞きたい質問は、コルーチンまたは同様の概念(スレッドなし)を使用して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、非同期フェッチを実行しているCコードと通信するのに十分な情報を格納するuserdataまたはカプセル化されたLuaテーブルのいずれかになります。IsComplete内部requestデータを使用して、そのリクエストが完了したかどうかを確認します。trueを返すGetReturnedValue場合にのみ呼び出すことができます。IsCompleteこの関数が値を返すことができるように、Luaスタックに値を置きます。

外部コードは、非同期のものを内部で処理する必要があるだけです。これらのLuaコルーチンの再開の間に、未処理のリクエストがある場合は、非同期のものがフェッチを実行しているものをすべてポンピングする必要があります。

于 2012-05-20T12:31:17.470 に答える