当前位置: 首页 > 面试题库 >

关于node.js内部异步I / O机制的困惑

郭永安
2023-03-14
问题内容
  1. 我了解到,在 nix平台上,node.js内部使用libeio 通过线程池执行异步 文件* I / O,对吗?
  2. 异步 网络 I / O呢?是libev完成的吗?还有一个线程池吗?
  3. 如果内部有线程池,那么它比传统的“每个请求一个线程”模型效率如何?每个I / O请求是否只有一个线程?
  4. Windows的机制是什么?我知道这是由IOCP完成的,并且有一个内核级线程池,对吗?
  5. 为什么linux还没有像Windows IOCP这样的本机完全AIO机制?将来会有吗?

根据长昌的答案进行更新:

  1. 我快速浏览了@changchang给出的源代码,发现可以通过 UV_THREADPOOL_SIZE 重置默认线程池大小,我想知道在哪种情况下将使用它?
  2. 我还发现getaddrinfo使用此线程池,除了fs还有其他线程了吗?并且,如果所有同步作业都将在此线程池中完成,那么默认大小“ 4”是否足够?
  3. 以我现在的理解,node.js进程中将有6个基本线程:1个V8线程(事件循环,运行用户javascript代码),1个libuv事件循环和4个线程池,对吗?
  4. 以及如何在Shell(Ubuntu)中看到这些线程?我使用 ps -eLf | grep节点| grep -v grep只看到两个:

root 16148 7492 16148 0 2 20:43 pts / 26 00:00:00 ./bin/node
/home/aaron/workspace/test.js
root 16148 7492 16149 0 2 20:43 pts / 26 00:00:00。 / bin / node
/home/aaron/workspace/test.js


问题答案:
  1. 首先,libuv已将其删除libeio。但是它确实会像libeio您提到的那样使用线程池执行异步文件I / O。

  2. libuv也会删除libev。它的异步网络I / O基于异步I /在不同的平台,如O接口epollkqueue并且IOCP,没有一个线程池。在主线程上运行一个事件循环,该循环uv轮询I / O事件并对其进行处理。

  3. 内部的线程池libuv是一个固定大小的线程池(在uinx中为4,类似于system)。它执行任务队列角色,并在请求增加时无限期地生成线程,从而避免了系统资源的耗尽。



 类似资料:
  • 支持Python异步。包括对Core和ORM使用的支持,使用了异步兼容的方言。 1.4 新版功能. 注解 从SQLAlChemy 1.4.3开始的异步扩展现在可以被认为是 测试级 软件。API细节可能会更改,但是在这一点上,不太可能有重大的向后不兼容更改。 参见 对内核和ORM的异步IO支持 -初始功能发布 异步集成 -示例脚本演示了asyncio扩展中核心和ORM使用的工作示例。 Asyncio

  • 本文向大家介绍Node.js异步I/O学习笔记,包括了Node.js异步I/O学习笔记的使用技巧和注意事项,需要的朋友参考一下 “异步”这个名词的大规模流行是在Web 2.0浪潮中,它伴随着Javascript和AJAX席卷了Web。但在绝大多数高级编程语言中,异步并不多见。PHP最能体现这个特点:它不仅屏蔽了异步,甚至连多线程也不提供,PHP都是以同步阻塞的方式来执行。这样的优点利于程序猿顺序编

  •  最大的特点就是采用异步式 I/O 与事件驱动的架构设计。对于高并发的解决方案,传统的架构是多线程模型,也就是为每个业务逻辑提供一个系统线程,通过系统线程切换来弥补同步式 I/O 调用时的时间开销。    

  • 传统的 Java I/O API 在应对不同的传输协议时需要使用不同的类型和方法。例如:java.net.Socket 和 java.net.DatagramSocket 它们并不具有相同的超类型,因此,这就需要使用不同的调用方式执行 socket 操作。 这种模式上的不匹配使得在更换一个网络应用的传输协议时变得繁杂和困难。由于(Java I/O API)缺乏协议间的移植性,当你试图在不修改网络传

  • “异步”这个名词其实很早就诞生了,但它的大规模流行确实在 Web 2.0 浪潮中,它伴随着 Ajax 的第一个 A(Asnchronous)席卷了 Web。Node 在出现之前,最习惯异步编程的程序员莫过于前端工程师了。前端编程算 GUI 编程的一种,其中充斥着各种 Ajax 和事件,这些都是典型的异步应用场景。 但事实上,异步早就存在于操作系统的底层。在底层系统中,异步通信信号量、消息等方式有了

  • 问题内容: 在服务器端Javascript引擎的上下文中,什么是非阻塞I / O或异步I / O?我认为这是相对于Java服务器端实现的优势。 问题答案: 同步执行通常是指按顺序执行的代码。异步执行是指未按照代码中出现的顺序运行的执行。在以下示例中,同步操作导致警报按顺序触发。在异步操作中,虽然似乎执行第二次,但不是。 同步:1,2,3 异步:1,3,2 阻塞与非阻塞 阻塞是指阻塞进一步执行直到该