1

Celluloid Actor のインスタンスを指定すると、 を使用futureして Actor メソッドを非同期に実行し、後で Future のvalueメソッドを使用して Actor メソッドの結果を取得できます (必要に応じてブロックします)。

システムに 2 つの別個のコンポーネントがあり、両方が同じ Actor メソッド (おそらく非常に高価なデータベース クエリ) を使用したいとします。これらのコンポーネントの両方が個別に呼び出されactor.future.expensive_queryた場合、クエリは 2 回実行され、各呼び出し元は独自の個別の Future オブジェクトを取得して結果を取得します。さらに、2 つのクエリは同時にではなく、シリアルに実行されます。actor.future.expensive_query代わりに、最初の呼び出し元によって作成された Future オブジェクトへの参照を取得するためだけに を2 回呼び出したい場合はどうなるでしょうか。セルロイドでそんなことができるの?

4

1 に答える 1

0

はい。しかし、これから説明するように、それは plain でも可能Rubyです。

たとえば、次のカスタム アクセサーを使用します。

def expensive_query!(*args)
  @expensive_query ||= future.expensive_query(*args)
  if @expensive_query.is_a? Celluloid::Future
    @expensive_query = @expensive_query.value
  end
  @expensive_query
end

クエリを再度実行したい場合は、外部でどこかでこれを行う必要があることに注意してください...そうしないと、既に実行されたクエリの結果を取得することになります( に保存されています@expensive_query):

@expensive_query = nil

reset_expensive_query!たとえば、おそらく。

于 2015-07-12T09:46:33.077 に答える