【发布时间】:2015-07-24 03:30:33
【问题描述】:
据我了解,虽然显然有一个“帮助”线程,但 Node.js 在单个线程中运行,因此,事件循环堆栈中的每个操作一个接一个地运行,其他操作并排队,而 Node 执行异步在后台进行 I/O,这样服务器就可以在执行非阻塞 I/O 的同时执行其他操作,而无需创建浪费的多个线程,I/O 完成并将其关联的回调拉入事件循环队列,这就是 Node 的重要之处。
但是,在我准备好的许多文章中,并不清楚异步 I/O 操作是否与 I/O 中的其他 I/O 操作并行运行一个单独的线程或进程,或者每个请求的 I/O 操作是否运行一个在事件循环执行其他操作时,在辅助线程中一个接一个。在阅读了“除了你的代码之外,一切都并行运行”这句话之后,这让我更加困惑。
问题是,多线程还是不多线程?如果每个异步操作都在单独的线程中运行,它使用的资源不是和 Apache 服务器一样多吗?
【问题讨论】:
-
因此系统本身的Node进程是单线程的,而Node将I/O/Asynchronous操作委托给操作系统,操作系统又会打开新的线程来执行每个操作?这就是所谓的“线程投票”吗?
-
FS 操作通常是唯一使用线程池的请求(虽然这是在 libuv 内部处理,但不是 node.js)。其他一切都在主线程上完成。特别是网络 I/O 都是通过针对每个操作系统(例如 Linux 上的 epoll、BSD/OS X 上的 kqueue、Windows 上的 IOCP 等)轮询活动的套接字来处理的。
-
@Lhaer:
thread pool不是这样。线程池是完全不同的东西。这种技术称为非阻塞 I/O 或 事件循环。
标签: javascript node.js multithreading asynchronous