4

我是 Finagle 的新手。我现在正在阅读某人的代码,发现 Future 对象在不同的​​连接操作中被重用。我的问题是这会导致 Future 对象被执行多次(在每个连接中),还是只会执行一次并存储结果以供以后连接?

例子:

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 会被执行两次,还是只执行一次?

4

3 回答 3

5

Future 只是一个值的容器,该值只会被设置一次!有不同的Future[T]状态:

  • 空的
  • 设置为 T 类型的值
  • 设置异常

当您在 Future 上使用map/flatMap函数时,您只需创建一个新的 Future ,它将是由该函数转换的前一个 Future 的结果。fABf

注意:

  • 如果未来A还没有被“填满”,你将有一个尚未被填满B
  • a设置值的线程也A将执行f(a)并设置值B
  • 如果A已“填充”,则 map/flatMap 的调用者也将执行f(a),但不会重新计算 的值A
  • 您也可以使用onSuccess/onFailure它来注册一些代码,以便在未来获得其价值时执行。
于 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

未来对象只执行一次。

Finagle 使用 com.twitter.util.A Future 是一个尚不可用的值的句柄。

使用 Future 的两种最基本的方法是: 阻塞并等待计算返回 注册一个回调,以便在计算最终成功或失败时调用 FuturePool 对象使您能够在其自己的线程上放置一个阻塞操作。

你可以从twitter 博客fingale github获得对 Finagle Future(Future Pool)的更多了解

于 2013-06-21T09:56:33.813 回答