我是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();
那么会被执行两次,还是只执行一次?
答案 0 :(得分:5)
Future是一个值的容器,只能设置一次值!
Future[T]
具有不同的状态:
当您在未来map/flatMap
上使用f
函数A
时,您将创建一个新的未来B
,它将是前一个变换的结果通过函数f
。
请注意:
A
尚未“填充”,您将收到尚未填充的B
a
中设置值A
的主题也将执行f(a)
并设置B
A
已经“填充”,那么map / flatMap的调用者也将执行f(a)
,但 NOT 将重新计算A
的值onSuccess/onFailure
来注册一些代码,以便在将来获得它的价值时执行。答案 1 :(得分: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对象只执行一次,无论它涉及多少个连接操作。
答案 2 :(得分:1)
未来对象只执行一次。
Finagle使用com.twitter.util.A Future是一个尚未提供的值的句柄。
使用Future的两种最基本的方法是: 阻止并等待计算返回 在计算最终成功或失败时注册要调用的回调 FuturePool对象使您可以在其自己的线程上放置阻塞操作。
更多地了解Finagle Future(未来池)