【问题标题】:Explain how non-blocking IO in Play works解释 Play 中的非阻塞 IO 是如何工作的
【发布时间】: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


【解决方案1】:

这些稀缺线程之一,T1,执行代理操作,从上到下运行代码,除了传递给 map 方法的函数内容,因为这取决于非阻塞 I/O 调用尚未完成。

此时,一个名为 future 的对象已被创建。

一旦 T1 返回 AsyncResult,它就会继续处理其他请求。

future 位于内存中,等待一些 IO 进来时完成。同时线程 T1 可以处理其他请求。

稍后,当来自 example.com 的响应终于可用时,

当响应可用时,这将调用一些内部 Play 代码,该代码读取响应并更改 future 的状态以赋予它一个值。当 future 获得一个值时,它会安排其 map 代码运行。这将在线程池的某个线程中运行,例如T2。

另一个线程 T2(可能与 T1 相同也可能不同)执行传递给 map 方法的函数。

没有任何一个线程阻塞等待来自 example.com 的响应。

Play 没有通过阻塞线程来等待 IO,而是秘密地注册了一个回调,以便当 IO 可用时,它将实现未来。当未来实现时,它会自动调用应用程序代码的下一部分。这意味着应用程序代码可以等待(不使用线程)直到 IO 可用。

【讨论】:

    猜你喜欢
    • 2012-04-22
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    相关资源
    最近更新 更多