两个回调可以同时(并行)执行代码吗?

时间:2018-06-01 13:37:52

标签: node.js express

我正在for循环中进行IO等待操作现在事情就是当所有操作终止时我想将响应发送到服务器。现在我只是想知道假设两个IO操作同时完全终止,现在它们可以同时执行代码(parallel)还是会串行执行?

据我所知,由于Node是Concurrent而不是Parallel语言,所以我认为它们不会同时执行。

3 个答案:

答案 0 :(得分:2)

node.js使用单个线程运行Javascript。这意味着两个Javascript永远不会在同一时刻运行。

node.js使用事件队列处理I / O完成。这意味着当I / O操作完成时,它会在事件队列中放置一个事件,当该事件到达事件队列的前面并且JS解释器已完成其他任何操作时,它将从该事件中提取该事件事件队列并调用与之关联的回调。

由于这个过程,即使两个I / O操作基本上在同一时刻完成,其中一个将把它的完成事件放在另一个之前的事件队列中(内部对事件队列的访问很可能由互斥锁控制)因此,一个将在另一个之前得到互斥锁)并且一个完成回调将首先进入事件队列,然后在另一个之前调用。两个完成回调不会在同一时间运行。

请记住,如果Javascript包含非阻塞I / O操作或其他异步操作,则可以同时“在飞行中”或“正在进行”。这是因为当您“等待”在Javscript中完成异步操作时,您将控制权返回给系统,然后只有在调用完成回调时才恢复处理。当JS解释器等待完成异步I / O操作并调用相关的回调时,其他Javascript可以运行。但是,实际上一次只能运行一段Javascript。

  

据我所知,由于Node是Concurrent而不是Parallel语言所以我认为它们不会同时执行。

是的,这是正确的。这并不是我所描述的,因为“并发”和“并行”没有严格的技术定义,但基于我认为你的意思,这是正确的。

答案 1 :(得分:1)

您可以使用let promises = []; for(...) { promises.push(somePromise); // somePromise represents your IO operation } Promise.all(promises).then((results) => { // here you send the response }

...
EXPOSE 9851 9852 4040 9092 9200 9300 5601 7474 7687 7473

VOLUME /home/user/path/to/project /Demo

WORKDIR /Demo

ENTRYPOINT runDemo.sh $SPARK_MASTER

您不必担心执行顺序。

答案 2 :(得分:1)

Node.js被设计为单线程。所以基本上没有办法'两个IO操作完全同时终止'可能发生。他们将逐一完成。