首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nodejs (Google )中事件循环使用什么逻辑流模型

Nodejs (Google )中事件循环使用什么逻辑流模型
EN

Stack Overflow用户
提问于 2021-06-29 09:46:38
回答 1查看 275关注 0票数 6

很久以来,我一直认为事件循环实现(利布夫?)用于Chrome和Node.js使用的线程。但是,我在Java的轻量级线程上阅读了这篇文章,说明如下:

用于为每个并发任务(和阻塞任务)创建线程的...instead,一个专用线程(称为事件循环)查看分配给非反应性模型中线程的所有任务,并在同一个CPU核心上处理每个任务。

关于并发应用的一章中的计算机系统。程序员的视角一书指出,现代操作系统为构建并发程序提供了三种基本方法(实现逻辑流的3种方法):

  • 过程。使用这种方法,每个逻辑控制流都是一个由内核调度和维护的进程。由于进程有独立的虚拟地址空间,希望相互通信的流必须使用某种显式进程间通信(IPC)机制。
  • I/O复用这是一种并发编程形式,应用程序在单个进程的上下文中显式地调度自己的逻辑流。逻辑流被建模为状态机,由于数据到达文件描述符,主程序显式地从状态转换到状态。由于程序是一个单一进程,所有流共享相同的地址空间。
  • 线。线程是在单个进程的上下文中运行并由内核调度的逻辑流。您可以将线程视为其他两种方法的混合体,由内核调度,如进程流和共享相同的虚拟地址空间(如I/O复用流)。

现在,我想知道事件循环是否属于I/O multiplexing逻辑流,而不使用线程?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-29 19:28:47

我和V8团队没有任何关系,但我会尽力回答这个问题。

首先,V8本身与事件循环无关。Node.js使用libuv实现事件循环,并为操作系统特定的API(网络、FS等)提供抽象。事件循环本身运行在单个OS线程上,大多数网络操作都是在基于线程的I/O复用API (epoll、kqueue等)上执行的。

但是libuv还有一个线程池来运行阻塞I/O (例如FS、DNS查找)和CPU密集型操作(例如密码)。线程池通过内存队列与事件循环集成(通信).当必须启动阻塞/CPU密集型任务时,它将被放入队列,稍后在其中一个线程上开始处理它。

因此,Node.js使用多种方法实现用户操作之间的并发: OS线程(BTW,包括worker_threads模块)、I/O复用、多进程(与child_process模块)。

V8还为自己的目的使用了许多OS线程(例如GC),但它不需要知道事件循环,也不需要为OS级别的API提供任何抽象。它的目标是,执行给定的JS代码,并提供一个坚实的嵌入式API,以便您可以使用它构建浏览器/运行时。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68176293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档