4

私はFinagleの初心者です。私は今誰かのコードを読んでいて、Futureオブジェクトがさまざまな結合操作で再利用されていることを発見しました。私の質問は、Futureオブジェクトが(各結合で)複数回実行されるのでしょうか、それとも1回だけ実行され、後の結合のために結果を保存するのでしょうか?

例:

Future<A> a= b
            .join(c)
            .flatMap(new SomeFunctionReturningA());

Future<Tuple2<A, B>> future1 = a.join(b);
Future<D> future2 = future1.flatMap(new SomeFunctionReturningD()); 
future2.get();

では、bは2回実行されますか、それとも1回だけ実行されますか?

4

3 に答える 3

5

Futureは値の単なるコンテナであり、値は1回だけ設定されます。Future[T]さまざまな状態があります:

  • タイプTの値で設定
  • 例外を設定する

Futuremap/flatMapの関数で使用する場合、関数によって変換された前のFutureの結果となる新しいFutureを作成するだけです。fABf

ご了承ください:

  • 未来Aがまだ「満たされていない」場合は、まだ満たされていないことになりますB
  • aに値を設定したスレッドAも実行f(a)され、に値が設定されます。B
  • がすでに「入力されている」場合A、map / flatMapの呼び出し元も実行されますが、の値は再計算f(a)されませんA
  • onSuccess/onFailureまた、futureがその値を取得したときに実行されるコードを登録するだけで使用することもできます。
于 2012-10-29T23:03:14.667 に答える
1

私は自分で簡単なテストを書きました:

import com.twitter.util.Function;
import com.twitter.util.Future;
import java.util.Random;
import org.junit.Test;
import scala.Tuple2;

public class FinagleFutureTest {
    int counter = 0;

    @Test
    public void test(){
        Counter counter = new Counter();
        Future<Counter> one = Future.value(counter).flatMap(new IncrementFunction());
        Future<Counter> two = one.flatMap(new IncrementFunction());
        Future<Tuple2<Counter, Counter>> three = two.join(one);
        Tuple2<Counter, Counter> tuple = three.flatMap(new TupleFunction()).get();
        System.out.println("one: "+ tuple._2().count+", "+tuple._2().randomInt);
        System.out.println("two: "+ tuple._1().count+", "+tuple._1().randomInt);
    }

    static class TupleFunction extends Function<Tuple2<Counter, Counter>, Future<Tuple2<Counter, Counter>>>{

        @Override
        public Future<Tuple2<Counter, Counter>> apply(Tuple2<Counter, Counter> t1) {
            return Future.value(t1);
        }

    }

    static class IncrementFunction extends Function<Counter, Future<Counter>>{
        @Override
        public Future<Counter> apply(Counter counter) {
            counter.add();
            return Future.value(counter);
        }
    }

    static class Counter{
        public int count = 0;
        public int randomInt;
        Counter(){
            Random random = new Random();
            randomInt = random.nextInt();
        }
        public void add(){
            count++;
        }
    }
}

結果は次のとおりです。

one: 2, 2009034289
two: 2, 2009034289

したがって、Futureオブジェクトは、関与する結合操作の数に関係なく、一度だけ実行されるという結論になります。

于 2012-10-26T16:05:24.467 に答える
1

Futureオブジェクトは1回だけ実行されます。

Finagleはcom.twitter.util.Aを使用します。Futureはまだ利用できない値のハンドルです。

Futureを使用する2つの最も基本的な方法は、次のとおりです。計算がブロックされ、計算が返されるのを待機します。計算が最終的に成功または失敗したときに呼び出されるコールバックを登録します。FuturePoolオブジェクトを使用すると、独自のスレッドにブロック操作を配置できます。

Finagle Future(Future Pool)については、TwitterブログFingalegithubから詳しく知ることができます。

于 2013-06-21T09:56:33.813 に答える