单个线程如何处理Node.js中的异步代码?

Kodanda Rama Durgarao poluri

我想知道,即使回调已完成。如果节点是单线程模型,如何并行执行主线程上的回调和其他进程。

jfriend00

首先,回调不是并行执行的。一次只有一个线程执行Java脚本,因此没有实际的Java代码并行执行。您可以同时进行多个异步本机代码操作,但是当它们需要运行某种Javascript完成回调时,它们一次只能运行一次,而不是并行运行。

Javascript是一种事件驱动的语言,这意味着计时器,来自异步磁盘I / O的回调,来自网络操作的回调等都使用事件队列。当JS引擎完成执行一段JavaScript并将控制权返回给系统时,JS引擎将下一个事件从事件队列中拉出并执行。本机代码操作可以通过将事件插入事件队列中来表明它们已完成并希望运行回调。

对于诸如HTTP请求之类的异步操作http.get(),基本上是这样的:

  1. 您的JavaScript通话 http.get()
  2. 该调用将发送http请求,然后立即返回。传递给您的任何回调http.get()均由http模块内部存储,并与该特定网络请求相关联。
  3. 您的javascript代码会http.get()继续执行,直到完成为止,然后将控制权返回给系统。
  4. 然后,一段时间后,来自先前HTTP请求的响应将返回到TCP引擎。这将导致http模块在Javascript事件队列中插入一个事件,以调用您以前发送的完成回调http.get()
  5. 如果此时Javascript引擎没有执行任何其他操作,则将执行您的回调并传递结果响应数据。
  6. 如果此时Javascript引擎正在执行某项操作,则该事件将坐在事件队列中,直到当前正在执行的Javascript片段完成并将控制权返回给系统为止。那时,JS引擎检查事件队列,并从队列中拉出下一个事件并执行它。如果这是您的回调,则此时将调用您的回调。

因此,各种操作(例如异步磁盘I / O,网络操作等)可以在后台运行,因为它们是由本机代码(而不是Javascript引擎)控制的。如果需要,该本机代码可以使用线程。fs模块使用线程,而该net模块不使用线程,因为本机OS已经支持异步联网操作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章