Multithreading 在游戏中如何处理异步回调!框架

Multithreading 在游戏中如何处理异步回调!框架,multithreading,asynchronous,playframework,Multithreading,Asynchronous,Playframework,我知道一个典型的Play应用程序将使用每个CPU核心一个线程。如果我没有弄错的话,当线程命中异步I/O函数时,它会在等待返回值的同时为其他进程打开该线程 我的问题是当返回值时会发生什么。当回调准备好执行时,Play框架如何将此任务重新分发到应用程序中?它是否有一个像Node.js这样的队列,其中每个“就绪”回调都被抛出到主队列中,应用程序范围的事件循环在它们可用时将它们逐个推回到线程中?您需要知道的一切都在这里: 和节点不同,Play不仅仅有一个事件循环,它还有线程池。Play的线程池实际上通

我知道一个典型的Play应用程序将使用每个CPU核心一个线程。如果我没有弄错的话,当线程命中异步I/O函数时,它会在等待返回值的同时为其他进程打开该线程


我的问题是当返回值时会发生什么。当回调准备好执行时,Play框架如何将此任务重新分发到应用程序中?它是否有一个像Node.js这样的队列,其中每个“就绪”回调都被抛出到主队列中,应用程序范围的事件循环在它们可用时将它们逐个推回到线程中?

您需要知道的一切都在这里:

和节点不同,Play不仅仅有一个事件循环,它还有线程池。Play的线程池实际上通常为每个核心配置多个线程,并且有多个用于不同目的的池


至于事件的具体触发方式,则取决于任务。在http连接上执行IO时,有一个Netty boss线程调用select来接收所有已注册http连接的新事件。一旦有事情发生,它会将工作委托给一个Netty worker线程,然后Play将做一些工作,并可能将进一步的工作委托给Play线程池。但是可能会有其他事件循环,具体取决于您正在使用的连接池等库。

因此,请确保我理解这一点,如果我错了,请纠正我。因此Netty Boss线程将接收客户端请求,并委托给工作线程,工作线程从通道执行非阻塞读写,然后删除以播放默认线程池(这是我们的应用程序),并执行一些工作,最后结果将用未来/承诺包装,这将被另一个线程接收,以便在调用完成时执行回调,但是这使用哪个线程池呢?