发出并行请求时 libuv 中发生了什么
What happend in libuv when you make parallel requests
由于 Javascript 是单线程,当我设法并行发出两个请求时,libuv 如何处理?例如:做出一系列承诺并解决后者
从技术上讲,您不会同时提出请求,一个先到。那个首先开始,但它会监听或检查一个是否完成,然后是另一个,来回直到一个完成。
我想您真正想问的是 libv8 如何处理同时 "in flight" 的两个异步请求。由于 Javascript 是单线程,您不能同时启动它们。第一个将启动,然后您的 JS 将能够 运行 再启动第二个。他们将同时 "in process"。
首先,nodejs中使用的库一般叫libuv,不是libv8。这里是 the doc for libuv.
libuv 如何做到这一点的答案是它取决于异步操作的类型。这是来自 libuv site:
的图表
libuv 中的 Disk I/O 通过线程池使用本机线程。本机线程 运行 执行每个磁盘 I/O 操作,然后完成,然后将事件放入 nodejs 事件队列,以便当 nodejs 可用时,它可以从事件队列中拉出该事件并调用为异步 I/O 操作注册的回调。此功能最初来自 libeio,但现在显然是它自己的实现。
libuv 中的网络操作 使用本机 OS 异步功能,例如 epoll、kqueue 和 IOCP。
由于 Javascript 是单线程,当我设法并行发出两个请求时,libuv 如何处理?例如:做出一系列承诺并解决后者
从技术上讲,您不会同时提出请求,一个先到。那个首先开始,但它会监听或检查一个是否完成,然后是另一个,来回直到一个完成。
我想您真正想问的是 libv8 如何处理同时 "in flight" 的两个异步请求。由于 Javascript 是单线程,您不能同时启动它们。第一个将启动,然后您的 JS 将能够 运行 再启动第二个。他们将同时 "in process"。
首先,nodejs中使用的库一般叫libuv,不是libv8。这里是 the doc for libuv.
libuv 如何做到这一点的答案是它取决于异步操作的类型。这是来自 libuv site:
的图表Disk I/O 通过线程池使用本机线程。本机线程 运行 执行每个磁盘 I/O 操作,然后完成,然后将事件放入 nodejs 事件队列,以便当 nodejs 可用时,它可以从事件队列中拉出该事件并调用为异步 I/O 操作注册的回调。此功能最初来自 libeio,但现在显然是它自己的实现。
libuv 中的网络操作 使用本机 OS 异步功能,例如 epoll、kqueue 和 IOCP。