我正在for循环中进行IO
等待操作现在事情就是当所有操作终止时我想将响应发送到服务器。现在我只是想知道假设两个IO
操作同时完全终止,现在它们可以同时执行代码(parallel
)还是会串行执行?
据我所知,由于Node是Concurrent
而不是Parallel
语言,所以我认为它们不会同时执行。
答案 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操作完全同时终止'可能发生。他们将逐一完成。