Ste*_*hen 2 scala scalability reactive-programming akka
我正试图找到akka演员并确定他们的好处.我知道许多参与者可以共享相同的线程,从而获得巨大的效率 - 但在Web应用程序的上下文中,Web容器应该在请求之间做同样的事情吗?
因此,好处可以归结为I/O - 阻塞I/O会暂停该线程以供其他人使用.
异步I/O是否消耗线程?当我得到一些I/O结果的未来时,将在I/O完成时使用一个线程?
这里描述的Java异步I/O模型很容易掌握.基本思想是有一个内部线程池,它从内核中检索已完成的I/O通知,然后调度到其他线程以对其执行所需的操作.
所以,从某种意义上说,是的,它使用线程.这里还有别的东西需要考虑:一切都是如此.那里的每一个软件都需要一个过程,在某个时刻,检查一块I/O是否已经完成,以便它可以在它上面执行后续任务(好吧,它可能是即发即忘,但那是实际诉讼有限.在以异步I/O着称的nodejs上,该线程被称为"事件循环"(尽管整体模型非常不同).
这里的要点是每个I/O操作没有一个线程的对应关系.相反,有一个内部线程池负责接收所有异步I/O完成事件,然后执行完成时所需的任何操作.
也许更好的问题是:Java中的异步I/O是否与正在处理的I/O请求数量成比例地消耗线程?不,它没有; 它消耗固定数量的线程.更有用的问题:在Java中启动异步I/O时,是否阻止了启动I/O的线程?不,不是的; 它会立即返回.与该主题相关的问题:Java中的异步I/O是否使用了actor线程池中的线程?不,它没有.
接下来,由异步I/O返回的未来.虽然I/O没有完成,但不会使用任何线程.但是,有一个线程池被分配给该未来的完成,并且当I/O完成时,来自该池的一个线程将用于执行与该未来完成相关联的操作.完成这些操作后,线程将返回到该线程池.该线程池可能不会与actor使用的线程池相同(尽管我认为可能有一种方法可以实现它).
| 归档时间: |
|
| 查看次数: |
534 次 |
| 最近记录: |