节点"实际上"处理线程?

时间:2014-07-07 21:50:07

标签: javascript multithreading node.js asynchronous computation

我读了很多关于节点js试图理解事件循环及其模式/反模式的内容。许多作者没有提到节点实际处理线程的一件事。然而,应用程序员当然无法访问它们,但很高兴知道它们存在以及何时启动它们。

据我所知,当Ryan Dahl解释它时,线程将仅用于文件系统访问和网络。因此:不是为了计算...而我在这里关心的是:为什么不进行计算?

即使我在回调函数中放置一个looong for循环,它也会在执行时阻塞整个循环。由于在http://www.slideshare.net/cacois/nodejs-patterns-for-discerning-developers上找到此图像,所有已注册的回调都将由节点的高级线程机制处理。但显然不是:(

enter image description here

即使从io和文件处理异步中获得了很多速度,为什么不进行整个步骤并使所有已注册的回调由节点的内部线程处理?

但令我印象深刻的是,共享并发不适用于尝试访问全局应用程序命名空间的单独线程。 (这可能是一个很大的原因)

您怎么看?

1 个答案:

答案 0 :(得分:4)

  

即使从io和文件处理异步中获得了很大的速度,为什么不进行整个步骤并使所有注册的回调由节点的内部线程处理?

这将打破关于Node.js的基本“好事”之一。如果你有这个:

if (a === 7) {
    console.log(a);
}
调用a时,

7 保证console.log,因为它是同步代码。并行执行同步代码的那种中断。当然,你可以在回调中进行任意中断并将它们转换为线程,但这并不比其他所有线程系统都好。

线程的问题还在于能够以一种任务队列很难完成的方式耗尽系统资源。