Multithreading node.js如何知道调用是否必须在线程池或事件循环中执行?
我读到node.js同时使用踏板和事件循环 我很想知道它是如何处理回电话的。。。它是否由EventEmitter指定(工程师是否知道它是否将被阻塞) 还是在运行时选择它的核心本身? 如果是这个,它如何检测它是异步运行还是线程运行 我已经阅读了很多参考资料,但是我没有找到这方面的内容。IM阅读源代码,但它很难,因为它是很多时间以来,我最后一次编码与C++。Multithreading node.js如何知道调用是否必须在线程池或事件循环中执行?,multithreading,node.js,architecture,asynchronous,Multithreading,Node.js,Architecture,Asynchronous,我读到node.js同时使用踏板和事件循环 我很想知道它是如何处理回电话的。。。它是否由EventEmitter指定(工程师是否知道它是否将被阻塞) 还是在运行时选择它的核心本身? 如果是这个,它如何检测它是异步运行还是线程运行 我已经阅读了很多参考资料,但是我没有找到这方面的内容。IM阅读源代码,但它很难,因为它是很多时间以来,我最后一次编码与C++。 谢谢你的JavaScript代码总是在一个线程中运行。这是因为V8 JavaScript引擎不是线程安全的 但是,作为一些C++代码的实现细节
谢谢你的JavaScript代码总是在一个线程中运行。这是因为V8 JavaScript引擎不是线程安全的
但是,作为一些C++代码的实现细节,可能有线程。例如,假设您编写了一些连接到数据库的JavaScript代码。您的JavaScript代码当然是异步的,就像任何好的节点代码一样。但是异步编码在C/C++世界中非常少见,因此数据库供应商可能没有编写异步C/C++API
所以,当有人正在编写一个节点包用于数据库访问时,他们必须编写一个垫片,它适应于“阻塞”C++行为和“非阻塞、事件驱动”节点行为。在调用“连接”方法时,这会指向生成新线程的C++代码,并且该线程向数据库发出(阻塞)“连接”调用,这会阻塞线程直到连接完成。然后C++代码将“连接完成”传递回事件队列,下次主(JavaScript)线程轮询事件队列时,回调将被触发。
因此,是的,有线程,但它们的使用应该对您完全透明。当您在用JavaScript编写Node.js代码时,您不需要担心线程——您只需要关心应该发生的事情。包作者可以使用线程,但这纯粹是一个实现细节,您不必担心它。您的JavaScript代码从不显式使用线程。您的JavaScript代码始终在单个线程中运行。这是因为V8 JavaScript引擎不是线程安全的
但是,作为一些C++代码的实现细节,可能有线程。例如,假设您编写了一些连接到数据库的JavaScript代码。您的JavaScript代码当然是异步的,就像任何好的节点代码一样。但是异步编码在C/C++世界中非常少见,因此数据库供应商可能没有编写异步C/C++API
所以,当有人正在编写一个节点包用于数据库访问时,他们必须编写一个垫片,它适应于“阻塞”C++行为和“非阻塞、事件驱动”节点行为。在调用“连接”方法时,这会指向生成新线程的C++代码,并且该线程向数据库发出(阻塞)“连接”调用,这会阻塞线程直到连接完成。然后C++代码将“连接完成”传递回事件队列,下次主(JavaScript)线程轮询事件队列时,回调将被触发。
因此,是的,有线程,但它们的使用应该对您完全透明。当您在用JavaScript编写Node.js代码时,您不需要担心线程——您只需要关心应该发生的事情。包作者可以使用线程,但这纯粹是一个实现细节,您不必担心它。您的JavaScript代码从不显式使用线程。您在哪里读到Node.js使用线程的?您的代码都在一个线程中运行(部分原因是V8 JavaScript引擎不是线程安全的)。这就是为什么在编写代码时不需要担心诸如关键部分之类的问题。在这里你可以阅读。引用:“当然,在后端,有用于DB访问和进程执行的线程和进程。”[…]啊,我明白了。我会根据上下文写一个答案。你在哪里读到Node.js使用线程的?您的代码都在一个线程中运行(部分原因是V8 JavaScript引擎不是线程安全的)。这就是为什么在编写代码时不需要担心诸如关键部分之类的问题。在这里你可以阅读。引用:“当然,在后端,有用于DB访问和进程执行的线程和进程。”[…]啊,我明白了。我会根据上下文写一个答案。很好的答案!我认为是节点本身的核心以异步或线程池的形式执行Javascript代码,我错了。现在我明白了。谢谢回答得好!我认为是节点本身的核心以异步或线程池的形式执行Javascript代码,我错了。现在我明白了。谢谢