异步非阻塞循环与多线程的实际例子是什么?

3
我最近一直在开发Node.js,对于事件循环的运作有了很好的理解。由于我有JavaScript的经验,使用Node对我来说是有道理的,但我想知道,有没有人放弃使用多线程系统而改用异步来提高性能?或者选择使用异步而不是多线程来提高性能?
在现实生活中,异步非阻塞I/O胜过多线程的真实案例有哪些呢?
2个回答

3
无论您是否使用多线程,所有现代操作系统的I/O操作都是本质上异步的。因此,说“异步更快”并不完全正确。然而,异步编程使您能够节省线程,并实现几乎相同的性能。在服务器上这很重要,因为您可以获得的线程数是有限的(由可用内存限制)。因此,使用异步编程不一定会获得更好的性能,但可以获得更好的I/O密集型任务的可扩展性。异步甚至在CPU密集型任务上表现更差,因为您不能将工作并行化在服务器核心之间进行。另一方面,I/O使用中断和DMA,这不涉及CPU。这就是您可以获得足够好的性能的方式,因为您可以继续执行,直到硬件通过信号中断通知您I/O完成为止。
编辑:我刚刚发现我没有回答您真正的问题。但是只要您知道异步如何使您受益,您就不需要真实世界的示例。只需要知道:
- 与数据库通信是I/O - 从磁盘读取或写入是I/O - 在网络上传输/接收数据包是I/O - 其余的是CPU
根据您使用I/O还是CPU,异步可能会带来更好的可扩展性或更差的性能。通常,Web应用程序是I/O密集型,这从异步编程中受益。

0

编程更容易,因为您不需要管理多个进程/线程之间的一致性/数据交换。
在创建简单的Web应用程序时,这种模型没有真正的优势,但是当有一个服务器同时管理多个连接,并且传递的数据在某种程度上被绑定在一起时,就会有优势。

从性能方面来看,有一些优点,因为具有多个线程/进程往往比单个线程使用更多的内存。
简单的数学:每个线程处理一个连接,每个线程需要1MB的RAM,很容易计算出您可以在一台计算机上拥有多少连接。使用node.js,您只需一个进程即可处理多个连接,并且它需要20MB的RAM和每个新连接4kb。我想您已经明白了。
异步I/O并不更快,但它可以帮助您在同时执行相同任务的情况下消耗更少的资源。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接