我被告知对于I/O密集型应用程序,非阻塞I/O会更好。对于CPU密集型应用程序,阻塞I/O要好得多。我找不到这种说法的原因。尝试了Google,但很少有文章涉及此主题并且没有太多详细信息。是否有人能为此提供深入的原因?
同时,我想弄清楚非阻塞I/O的缺点是什么。
在查看另一个线程之后,在这里,我能够理解的一种原因是,只有当I/O进程足够繁重时,我们才能看到使用非阻塞I/O的显着性能提升。它还指出,如果I/O操作的数量很大(典型的Web应用程序场景),其中有许多请求寻找I/O请求,那么我们也可以使用非阻塞I/O来实现显着的性能提升。
因此,我的问题归结为以下列表:
1. 对于CPU密集型应用程序,最好启动线程池(或scala的executionContext)并将工作分配给线程池的线程。(我认为这肯定比自己生成线程并手动划分工作有优势。此外,使用Future的异步概念,即使是CPU密集型工作,也可以使用回调返回,从而避免与多线程阻塞相关的问题?)。如果有足够快速的I/O,则可以在线程池本身的线程上使用阻塞原则进行I/O。我是对的吗?
2. 非阻塞I/O技术上的缺点或开销是什么?为什么如果I/O足够快或需要的I/O操作很少,我们不会看到使用非阻塞I/O的性能提升?最终是操作系统处理I/O。无论I/O的数量是大还是小,让操作系统处理疼痛会有什么区别。那么这里有什么不同之处呢?
同时,我想弄清楚非阻塞I/O的缺点是什么。
在查看另一个线程之后,在这里,我能够理解的一种原因是,只有当I/O进程足够繁重时,我们才能看到使用非阻塞I/O的显着性能提升。它还指出,如果I/O操作的数量很大(典型的Web应用程序场景),其中有许多请求寻找I/O请求,那么我们也可以使用非阻塞I/O来实现显着的性能提升。
因此,我的问题归结为以下列表:
1. 对于CPU密集型应用程序,最好启动线程池(或scala的executionContext)并将工作分配给线程池的线程。(我认为这肯定比自己生成线程并手动划分工作有优势。此外,使用Future的异步概念,即使是CPU密集型工作,也可以使用回调返回,从而避免与多线程阻塞相关的问题?)。如果有足够快速的I/O,则可以在线程池本身的线程上使用阻塞原则进行I/O。我是对的吗?
2. 非阻塞I/O技术上的缺点或开销是什么?为什么如果I/O足够快或需要的I/O操作很少,我们不会看到使用非阻塞I/O的性能提升?最终是操作系统处理I/O。无论I/O的数量是大还是小,让操作系统处理疼痛会有什么区别。那么这里有什么不同之处呢?