【问题标题】:What happend in libuv when you make parallel requests当您发出并行请求时,libuv 中发生了什么
【发布时间】:2016-06-05 17:42:04
【问题描述】:

由于 Javascript 是单线程的,当我设法并行发出两个请求时,libuv 如何处理?例如:做出一系列承诺并解决后者

【问题讨论】:

  • 它们在操作系统层也是异步的。最好在这里讨论并发请求,而不是“并行”请求。
  • 感谢@Bergi 的正确表述

标签: javascript node.js asynchronous v8 libuv


【解决方案1】:

我想您真正要问的是 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。

【讨论】:

  • 谢谢,我做到了。是的,我是该平台的新手
【解决方案2】:

从技术上讲,您不会使请求并行,而是先提出请求。一个首先开始,但如果完成,它会侦听或检查一个,然后是另一个,来回来回直到一个先完成。

【讨论】:

  • 感谢您的回答@Johnathan Ralls,我也希望如此,它需要一个接一个。但我从一个人那里听到他在讲关于 spawn 的事情。那时我还没有完全理解。
猜你喜欢
  • 2018-07-21
  • 2012-06-24
  • 2013-06-09
  • 2017-03-24
  • 2018-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多