很久以来,我一直认为事件循环实现(利布夫?)用于Chrome和Node.js使用的线程。但是,我在Java的轻量级线程上阅读了这篇文章,说明如下:
用于为每个并发任务(和阻塞任务)创建线程的...instead,一个专用线程(称为事件循环)查看分配给非反应性模型中线程的所有任务,并在同一个CPU核心上处理每个任务。
关于并发应用的一章中的计算机系统。程序员的视角一书指出,现代操作系统为构建并发程序提供了三种基本方法(实现逻辑流的3种方法):
现在,我想知道事件循环是否属于I/O multiplexing逻辑流,而不使用线程?
发布于 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,以便您可以使用它构建浏览器/运行时。
https://stackoverflow.com/questions/68176293
复制相似问题