2015-04-17 21 views
1

我知道一个典型的Play应用程序将在每个CPU内核中使用一个线程。如果我没有弄错,当一个线程访问一个异步I/O函数时,它会在其等待返回值时为其他进程打开该线程。如何在Play中处理异步回调!框架?

我的问题是关于返回值时会发生什么。当回调准备好执行时,Play框架如何将这个任务重新分配到应用程序中?它是否有像Node.js这样的队列,其中每个“就绪”回调被引入到主队列中,并且应用程序范围内的事件循环在它们变为可用时将它们逐一推回到线程中?你需要知道

回答

1

一切都在这里:

https://www.playframework.com/documentation/2.3.x/ThreadPools

不同节点,游戏不只是一个事件循环,播放具有线程池。 Play的线程池实际上通常配置为每个内核有多个线程,并且有多个用于不同目的的池。

至于事件是如何触发的,它取决于任务。在http连接上执行IO,还有一个Netty老板线程调用select来接收所有注册的http连接的新事件。只要发生什么事情,它就会将工作委托给Netty工作线程,然后Play会做一些工作,并可能将进一步的工作委托给Play线程池。但可能会有其他事件循环,具体取决于您正在使用的其他库,连接池等。

+0

因此,只是为了确保我理解这一点并纠正我,如果我错了。因此,Netty Boss线程将收到一个客户请求,并委托给工作线程,而工作线程从通道执行非阻塞读写,然后删除到Play默认线程池(这是我们的应用程序),并做一些工作,并且最后结果将被Future/Promise包装起来,并且在完成时会被另一个执行回调的线程取回,但是它使用哪个线程池? – peter