2015-03-03 65 views
3

function2()通过函数2()获得什么利润(除了两个GET查询执行时的小并行性)?在我看来,控制器线程在两种情况下都不被阻塞,但是在等待结果时必须阻止其中一个后台线程。更好的例子是,当我们查看function3()时,我们看到databaseDao线程被阻塞直到操作完成(在使用JPA的dao内部)。发挥框架,承诺,非阻塞线程编程

public static F.Promise<Result> function1() { 
    final F.Promise<WSResponse> twitterPromise = WS.url("http://www.twitter.com").get(); 
    final F.Promise<WSResponse> typesafePromise = WS.url("http://www.typesafe.com").get(); 

    return twitterPromise.flatMap((twitter) -> typesafePromise.map((typesafe) -> ok(twitter.getBody() + typesafe.getBody()))); 
} 

public static F.Promise<Result> function2() { 
    F.Promise<String> promise = F.Promise.promise(() -> { 
     HttpClient client = HttpClientBuilder.create().build(); 
     HttpGet request1 = new HttpGet("http://www.twitter.com"); 
     HttpGet request2 = new HttpGet("http://www.typesafe.com"); 

     HttpResponse response = client.execute(request1); 
     HttpResponse response2 = client.execute(request2); 

     // result is not important 
     return response.toString() + response2.toString(); 
    }); 

    return promise.map(Results::ok); 
} 

public static F.Promise<Result> function3() { 
    F.Promise<String> promise = F.Promise.promise(() -> databaseDao.longRunningOperation()); 

    return promise.map(Results::ok); 
} 

如果函数阻塞我们的后台线程池消失得很快。那么非盈利性的框架和Spring框架和tomcat的承诺呢?

编辑:

public static F.Promise<Result> function4() { 
    F.Promise<String> promise = F.Promise.promise(() -> { 
     HttpClient client = HttpClientBuilder.create().build(); 
     HttpGet request1 = new HttpGet("http://www.twitter.com"); 
     HttpResponse response = client.execute(request1); 

     return response.toString(); 
    }); 

    F.Promise<String> promise2 = F.Promise.promise(() -> { 
     HttpClient client = HttpClientBuilder.create().build(); 
     HttpGet request2 = new HttpGet("http://www.typesafe.com"); 
     HttpResponse response2 = client.execute(request2); 
     return response2.toString(); 
    }); 

    return promise.flatMap(p1 -> promise2.map(p2 -> ok(p1 + p2))); 
} 

上面的函数阻止两个线程,因此它比功能1更糟?但执行时间可以相当。例如,如果promise1需要5秒,并且promise2需要4秒,结果会在5秒内出现?

+0

在你的第一个例子中,如果twitter req。需要5秒钟和类型安全需求。需要4秒钟,你会在5秒内得到你的结果。在第二个功能中,需要9秒。另外对于我所知道的JDBC而言,如果你使用Play,Spring或者???,那么它并不重要,它会阻止某处 – Salem 2015-03-03 15:27:54

回答

2

function2()相对于function2()有什么好处(除了执行两个GET查询时的小并行性)?

这不仅仅是并行性。玩WS是基于AsyncHttpClient构建的,它是一个非阻塞API。在function2它看起来像你正在使用Apache HttpClient,这是一个阻塞API。并行性有所帮助。至于@Salem已经表示,function1将只会提出最长的请求,而function2将只要这两个请求每次都会花费时间。

在我看来控制器线程被阻塞非在这两种情况下,...

诚然,我们不会阻止播放机的内部,只要Promise穿梭到另一个ExecutionContext

...但是在等待结果时必须阻止后台线程之一。

不正确。由于function1仅对WS API执行异步调用,因此它不会阻止任何线程等待响应。 function2可能不会阻塞负责控制器功能的线程,但它必须阻止某个地方。这并不是说将它包装在Promise中是一个坏主意 - 如果它必须阻止,它可能会在其他地方做到。

...看看function3()我们看到databaseDao线程被阻塞直到操作完成(使用JPA内部dao)。

事实上,大多数数据库驱动程序都会阻塞,除了尝试不太流行的异步驱动程序之外,没有任何办法可以解决这个问题。 function2function3在行为上比function1function2更接近。 function真的属于它自己的一类。

如果函数阻塞我们的后台线程池消失得很快。

是的,但大多数时候我们必须阻止某处,如果您有使用异步API的选择,那么很好。例如,由于上面解释的原因,我总是会使用function1而不是function2。但是对于数据库调用,我使用阻塞API,因为在数据库中的应用程序中,如果我的数据库已经超载了查询,那么保存一些应用程序线程并不能真正帮助我。

上面的函数[function4]阻塞两个线程,所以它比function1差?但执行时间可以相当。例如,如果promise1需要5秒,并且promise2需要4秒,结果会在5秒内出现?

function4更糟糕的是它比function1阻塞更多。是否影响您的应用程序的性能立即取决于您是否碰到线程数。但我没有看到任何理由选择function4而不是function1function4可以在与function1,提供的相当的时间内完成,它具有必要的线程来完成。如果池中只有一个线程可用,那么第二个许诺可能需要等待第一个完成才能执行。在function1,这不会发生。

+0

你可以看一下编辑部分吗?并回答我。谢谢 :) – user2860204 2015-03-04 12:40:25