我想知道,即使回调已完成。如果节点是单线程模型,如何并行执行主线程上的回调和其他进程。
首先,回调不是并行执行的。一次只有一个线程执行Java脚本,因此没有实际的Java代码并行执行。您可以同时进行多个异步本机代码操作,但是当它们需要运行某种Javascript完成回调时,它们一次只能运行一次,而不是并行运行。
Javascript是一种事件驱动的语言,这意味着计时器,来自异步磁盘I / O的回调,来自网络操作的回调等都使用事件队列。当JS引擎完成执行一段JavaScript并将控制权返回给系统时,JS引擎将下一个事件从事件队列中拉出并执行。本机代码操作可以通过将事件插入事件队列中来表明它们已完成并希望运行回调。
对于诸如HTTP请求之类的异步操作http.get()
,基本上是这样的:
http.get()
http.get()
均由http模块内部存储,并与该特定网络请求相关联。http.get()
继续执行,直到完成为止,然后将控制权返回给系统。http.get()
。因此,各种操作(例如异步磁盘I / O,网络操作等)可以在后台运行,因为它们是由本机代码(而不是Javascript引擎)控制的。如果需要,该本机代码可以使用线程。该fs
模块使用线程,而该net
模块不使用线程,因为本机OS已经支持异步联网操作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句