节点背景线程 – 何时获得创build?

我最近在和Node做了相当多的工作,试图build立一个具有一定特性的系统,其中一个是非阻塞/并行性 – 一个Node强大的套装,据我所知。

我不完全理解的是一个单独的线程被分离出来处理一些处理。 我相当起诉这发生在一个函数调用/callback,但肯定不是全部。

在我的具体情况下,这是一个基于Express的应用程序。 在应用程序启动时,它做了几件事情,包括实例化一个基于RabbitMQ的“总线”,一个将写入总线(objA)的对象和一个订阅总线并处理消息的对象(objB)。

objA将在快速回拨中写入公共汽车

app.put((req,res) => { objA.methodWhichWritesToBus(); }); 

我相信在这一点上, objA.methodWhichWritesToBus是在后台/工作线程中执行的 – 不pipe你调用它,而不是主事件循环。

这是唯一发生这种事情的地方吗? methodWhichWritesToBus IO IO instensive(它在另一个盒子上调用一个弹性search服务,并且带回了10到100的成千上万的logging)和大量的链接promise等等,但是没有一个被分离出来,是吗?

如何调用该方法的obj在Expresscallback之外被实例化 – 这是否会影响并行主机?

最后,影响/迫使一个方法等方法“在后台运行”?

我一直在对这个进行testing,现在testing一下,但是所有的testing都在一台机器上,所以很难说出发生了什么事情。

谁能为我澄清这一点?

预答案:这是一个通过阅读和学习最好的主题,通过编码练习巩固你的理解,并以一种重要的方式来处理技术。 你不会基于Q&A格式来“得到它”。 那说…

我不完全理解的是当一个单独的线程被分离出来处理一些处理。

从来没有,有点。 在您的JavaScript程序中发生的计算中的“处理”发生在主事件循环线程中。 故事结局。 但是,等待I / O从操作系统回来不被认为是“处理”,所以有节点和操作系统pipe理各种队列来跟踪未决的I / O请求,并在数据准备就绪时调用callback。 有一些线程节点在内部使用OS来pipe理这些东西,但从程序的angular度来看,这些线程是不相关的。 你的程序可以请求节点做一些IO,然后你的程序并行运行,当I / O完成时,节点将最终调用主事件循环中的callback,并且可以处理结果。

我相信在这一点上,objA.methodWhichWritesToBus是在后台/工作线程中执行的 – 不pipe你调用它,而不是主事件循环。

你可以称之为“asynchronous”,每当你做IO,包括文件系统调用,networking或subprocess,都会发生这种情况。 这就是说,相当多。

如何调用该方法的obj在Expresscallback之外被实例化 – 这是否会影响并行主机?

不。

最后,影响/迫使一个方法等方法“在后台运行”?

通常,I / O默认是asynchronous完成的,所以不需要强制任何东西在后台运行。 它通过节点核心API自身进入节点devise。 但是,可以使用setImmediatesetTimeoutprocess.nextTick将同步处理延迟到将来的事件循环。 我在我的博客文章setTimeout和朋友中详细解释了这些。

更确切地说,所有networking都是asynchronous的。 故事结局。 具体而言,可用的节点核心中的API都是asynchronous的,并且在节点中根本没有可用的同步API。 对于文件系统IO和subprocess,同时存在同步API和asynchronousAPI,但同步API只能在特殊的有限情况下使用,如果您不确定在这种特定情况下是否可以进行同步IO API调用,你应该使用asynchronousAPI,这样你就不会破坏使节点执行的关键。