据我所知,典型的Play应用程序将为每个CPU核心使用一个线程。如果我没有弄错的话,当一个线程遇到异步I / O函数时,它会在等待返回值时为其他进程打开该线程。
我的问题是关于返回值时会发生什么。当回调准备好执行时,Play Framework如何将此任务重新分配到应用程序中?它是否有像Node.js这样的队列,每个'ready'回调都被抛入主队列,而一个应用程序范围的事件循环在它们可用时将它们一个接一个地推回到一个线程中?
答案 0 :(得分:1)
您需要知道的一切都在这里:
https://www.playframework.com/documentation/2.3.x/ThreadPools
与节点不同,Play并不只有一个事件循环,Play有线程池。 Play的线程池实际上通常配置为每个核心有多个线程,并且有多个池用于不同的目的。
就事件的确切触发方式而言,它取决于任务。在http连接上执行IO,有一个Netty boss线程调用select来接收所有已注册的http连接的新事件。一旦发生某些事情,它会将工作委托给Netty工作线程,然后Play会做一些工作,并可能将更多工作委托给Play线程池。但是可能还有其他事件循环,具体取决于您使用的其他库,连接池等等。