【发布时间】:2018-01-11 09:37:33
【问题描述】:
我发现这篇文章解释了非阻塞 IO Play 框架:https://engineering.linkedin.com/play/play-framework-async-io-without-thread-pool-and-callback-hell
那篇文章中的代码示例
object ProxyController extends Controller {
def proxy = Action {
val responseFuture: Future[Response] = WS.url("http://example.com").get()
Logger.info("Before map")
val resultFuture: Future[Result] = responseFuture.map { resp =>
Logger.info("Within map")
// Create a Result that uses the http status, body, and content-type
// from the example.com Response
Status(resp.status)(resp.body).as(resp.ahcResponse.getContentType)
}
Logger.info("After map")
Async(resultFuture)
}
那篇文章的解释:
在底层,Play 使用了一个线程池,每个 CPU 一个线程 核。这些稀缺线程之一,T1,执行代理操作, 从上到下运行代码,除了内容 传递给 map 方法的函数,因为这取决于 尚未完成的非阻塞 I/O 调用。一旦 T1 返回 AsyncResult,它继续处理其他请求。 后来,当 来自 example.com 的响应终于可用,另一个线程 T2 (可能与 T1 相同也可能不同)执行传递的函数 到地图方法。没有任何一个线程被阻塞 等待来自 example.com 的响应。
我不明白那段中突出显示的内容。 T1 已返回线程池,应用程序如何跟踪并接收来自 example.com 的响应,然后提交线程 T2 以执行 map 函数。
请有人解释一下。
【问题讨论】:
-
您的问题实际上是“异步 IO 是如何工作的?”,您可以阅读有关 here 以及其他很多地方的信息。
-
没有。我的意思是应用程序如何监听并知道 example.com 何时完成提交线程 T2。有另一个线程提交听吗?
-
答案是可能的。 JVM 可以通过多种方式实现这一点。如果是,则说明您无权访问。
-
这个链接回答了我的问题blog.omega-prime.co.uk/2015/09/03/…
标签: multithreading playframework future