2012-10-26 18 views
4

我是Finagle的新手。我正在閱讀某人的代碼,發現Future對象在不同的​​連接操作中被重用。我的問題是會導致Future對象被多次執行(在每個連接中),還是隻會執行一次並將結果存儲到以後的連接中?Finagle未來的對象,它們是可重用的?

例子:

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中被執行了兩次,或者只是一次?

回答

5

未來只是一個價值的容器,價值只會被設置一次! 的Future[T]有不同的狀態:

  • 設置與類型T的有異常

當您在未來A使用map/flatMap與函數f

  • 設置的值,您只需創建一個新的Future B,這將是前一個由函數f轉換的結果。

    需要注意的是:

    • 如果未來A還沒有「填」你還沒有一個尚未充滿B
    • A設置的值a線程也將執行f(a)並設置在B
    • 值如果A已經被「填滿」,那麼地圖的主叫/ flatMap也將執行f(a),但它會重新計算VALU e的A
    • 你也可以使用onSuccess/onFailure,它只會註冊一些代碼,以便在將來獲得它的價值時執行。
  • 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 
    

    所以得出的結論是,未來的對象只執行一次,不管有多少加入它參與操作英寸

    1

    未來的對象只能執行一次。

    Finagle使用com.twitter.util.A Future是一個尚未提供值的句柄。

    使用未來的兩種最基本的方式是: 塊,等待計算返回 註冊一個回調,當計算最終是成功還是失敗 一個FuturePool對象允許您將阻塞操作被調用在自己的線程。

    您可以從twitter blogfingale github

    更多瞭解Finagle未來(未來池)
    相關問題