node.js如何知道是否必须在线程池或事件循环中执行调用?

时间:2012-02-19 12:49:19

标签: multithreading node.js architecture asynchronous

我已经读过node.js使用了两个踏板和一个事件循环。

我很想知道它是如何知道如何处理回叫的......它是由EventEmitter指定的(工程师是否知道它是否会阻塞)?

或者是在运行时选择它的核心本身? 如果是这个,它如何检测是否必须运行异步或线程?

我已经阅读了很多资源,但我没有找到这个。我正在阅读源代码,但这很难,因为自从我上次用C ++编码以来已经很长时间了。

感谢

1 个答案:

答案 0 :(得分:3)

您的JavaScript代码始终在单个线程中运行。那是因为V8 JavaScript引擎不是线程安全的。

但是,作为某些C ++代码的实现细节,可能存在线程。例如,假设您编写了一些连接到数据库的JavaScript代码。您的JavaScript代码当然是异步的,就像任何好的Node代码一样。但是异步编码在C / C ++世界中非常罕见,因此数据库供应商可能没有编写异步C / C ++ API。

因此,当有人编写用于数据库访问的Node包时,他们必须编写一个垫片,以适应“阻塞”C ++行为和“非阻塞,事件驱动”节点行为。当你调用一个“连接”方法时,它会转到生成一个新线程的C ++代码,并且该线程向数据库发出一个(阻塞)“连接”调用,这会阻塞线程直到连接完成。然后C ++代码将“连接完成”传递回事件队列,下一次主(JavaScript)线程轮询事件队列时,您的回调将被触发。

所以是的,有线程,但它们的使用对你来说应该是完全透明的。当你在JavaScript中编写Node.js代码时,你不需要担心线程 - 你只关心它们应该发生的事情。包作者可能会使用线程,但这纯粹是一个实现细节,你永远不必担心它。您的JavaScript代码从不显式使用线程。