【发布时间】:2016-06-05 17:42:04
【问题描述】:
由于 Javascript 是单线程的,当我设法并行发出两个请求时,libuv 如何处理?例如:做出一系列承诺并解决后者
【问题讨论】:
-
它们在操作系统层也是异步的。最好在这里讨论并发请求,而不是“并行”请求。
-
感谢@Bergi 的正确表述
标签: javascript node.js asynchronous v8 libuv
由于 Javascript 是单线程的,当我设法并行发出两个请求时,libuv 如何处理?例如:做出一系列承诺并解决后者
【问题讨论】:
标签: javascript node.js asynchronous v8 libuv
我想您真正要问的是 libv8 如何处理同时“进行中”的两个异步请求。由于 Javascript 是单线程的,因此您不能同时启动它们。将启动一个,然后您的 JS 将能够运行更多并启动第二个。它们都将同时处于“处理中”。
首先,nodejs中使用的库一般叫libuv,不是libv8。这里是the doc for libuv。
libuv 如何做到这一点的答案是它取决于异步操作的类型。这是libuv site的图表:
libuv 中的磁盘 I/O 通过线程池使用本地线程。本地线程运行每个磁盘 I/O 操作,然后完成,然后将事件放入 nodejs 事件队列,以便当 nodejs 可用时,它可以从事件队列中拉出该事件并调用为异步注册的回调 I /O 操作。这个功能最初来自 libeio,但现在显然是它自己的实现。
网络操作在 libuv 中使用原生操作系统异步功能,例如 epoll、kqueue 和 IOCP。
【讨论】:
从技术上讲,您不会使请求并行,而是先提出请求。一个首先开始,但如果完成,它会侦听或检查一个,然后是另一个,来回来回直到一个先完成。
【讨论】: