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

时间:2012-06-15 14:51:24

标签: multithreading node.js asynchronous io event-loop

我最近在Node.js中进行了开发,并且很好地了解了事件循环的进展情况。鉴于我有使用javascript的经验,Node对我来说很有意义,但是我想知道,有没有人停止使用多线程系统并且为了PERFORMANCE而异步?或者选择使用异步而不是多线程来获得性能?

现实世界中多线程的异步非阻塞I / O胜利的现实例子是什么?

2 个答案:

答案 0 :(得分:4)

无论您是否进行多线程处理,所有现代操作系统I / O操作本质上都是异步的。所以说“异步更快”并不是真的。但是,异步编程允许您保存具有几乎相同性能的线程。这在服务器上很重要,因为您可以获得的线程数量是有限的(受可用内存限制)。

因此,使用异步,您不一定能获得更好的性能,但I / O繁重任务的可扩展性更高。 Async甚至可能在CPU密集型任务上表现更差,因为您无法在服务器核心之间并行化工作。另一方面,I / O适用于不涉及CPU的中断和DMA。这就是你如何获得足够好的性能,因为你可以继续执行,直到硬件通过发出中断信号通知你I / O完成。

编辑:我刚才发现我没有回答你的实际问题。但只要你知道异步对你有什么好处,你可能就不需要现实世界的例子了。只知道:

  • 与数据库通信是I / O
  • 读取或写入磁盘是I / O
  • 通过网络发送/接收数据包是I / O
  • 其余的是CPU

根据您是否使用I / O或CPU,更多异步可以为您提供出色的可扩展性或更差的性能。通常,Web应用程序是I / O密集型的,这可以从异步编程中获益。

答案 1 :(得分:0)

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

Perfomance-wise有一些优点,因为拥有多个线程/进程往往比单个线程使用更多内存。
简单的数学:有一个线程处理一个连接,每个线程在RAM中需要1MB,很容易弄清楚你可以在一台计算机上连接多少。使用node.js,您有一个处理多个连接的进程,例如RAM为20MB,每个新连接为4kb。我想你明白了。
异步I / O速度并不快,但它可以帮助您消耗更少的资源,同时多次执行相同的操作。

相关问题