为什么nodejs fs同步同步api在应该在工作池(nodejs的默认值)上执行时会阻塞主线程(甚至循环)?

问题描述 投票:0回答:1

这是一个理论问题,

我以前认为在nodejs中,诸如I / O,网络之类的昂贵任务将在工作池中的工作程序上执行,而不是在主节点事件循环上执行,因此它不会阻塞事件循环。

我读了一些有关它的文章,e.g nodejs docs

但是今天我读了一篇文章,写道:

“因为异步绝对是在这种情况下更好的解决方案,所以它是方法的同步版本,带有-Sync后缀。您应该记住,强烈建议不要使用sync方法,当使用,将阻止主线程执行任何其他操作。请谨慎使用(并且仅在确实需要时使用!)!“

所以,如果是真的,为什么这些同步任务在应在工作池上执行时会阻塞主偶数循环?

谢谢

node.js multithreading asynchronous synchronous event-loop
1个回答
0
投票

所以,如果是真的,为什么这些同步任务在应在工作池上执行时会阻塞主偶数循环?

因为同步版本是专门为阻止主线程而设计的,所以它将等待它们完成后再返回。它们被设计为阻塞API。这就是他们的设计意图。如果他们不这样做,那么它们将是非阻塞和异步的,而不是阻塞和同步的。

问题不在于实际工作是在什么线程上完成的。问题是同步版本是专门设计用于使主线程等待直到完成。这是为了在某些需要阻塞行为的情况下简化编程。例如,在服务器的启动代码中使用一些同步文件I / O并不少见。例如,require()确实阻止了文件I / O加载脚本。

但是,正如您在文章中所看到的,仅在服务器启动并运行并处理请求后,才希望使用异步文件I / O。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.