节点后台线程 - 什么时候创建?

时间:2014-06-01 17:56:32

标签: multithreading node.js express

我最近在Node上做了大量的工作,试图建立一个具有某些特性的系统,其中一个是非阻塞/并行 - 一个Node强大的套装,据我所知。 / p>

当分离出一个单独的线程来处理某些处理时,我不完全理解的是。我很可能会在函数调用/回调中发生这种情况,但肯定不是全部。

在我的具体情况下,它是基于Express的应用程序。在app启动时,它会执行几项操作,包括实例化基于RabbitMQ的"总线",一个具有将写入总线的方法的对象(objA)和将订阅总线并处理传递的消息的对象它(objB)。

objA将在快速回调中写入总线

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

我相信在这一点上,objA.methodWhichWritesToBus在后​​台/工作线程中执行 - 无论你怎么称呼它,而不是在主事件循环上。

这是发生这种事情的唯一一点吗? methodWhichWritesToBus是IO instensive(它在另一个盒子上称为弹性搜索服务,并将10个记录中的10个记录带回来),带有许多链接的承诺等,但这些都没有得到分开了,是吗?

调用该方法的obj实例化外部 Express回调这一事实如何影响并行主义?

最后,影响/强制方法等的方法是"在后台运行"?

我一直在测试它,测试一段时间,但现在只在一台机器上进行测试,因此很难分辨出发生了什么。

谁可以为我澄清这个?

1 个答案:

答案 0 :(得分:3)

预答案:这是一个通过阅读和阅读,编写练习以巩固您的理解以及以显着方式使用该技术而获得的最佳主题。你不会基于Q& A格式“得到它”。那说......

  

我不完全理解的是,当一个单独的线程被分离以处理某些处理时。

从不,有点儿。像在javascript程序中发生的计算中的“处理”发生在主事件循环线程中。故事结局。但是,等待I / O从OS返回不被视为“处理”,因此节点和操作系统管理各种队列以跟踪挂起的I / O请求并在数据准备好时调用回调。内部有一些线程节点用于管理这些东西,但从程序的角度来看,这些线程是无关紧要的。您的程序可以要求节点执行某些IO,然后您的程序保持并行运行,并且当I / O完成时,节点最终将在主事件循环中调用回调,您可以处理结果。

  

我相信在这一点上,objA.methodWhichWritesToBus在后台/工作线程中执行 - 无论你怎么称呼它,而不是在主事件循环上。

您可以“异步”调用它,只要您执行IO(包括文件系统调用,网络或子进程),就会发生这种情况。也就是说,相当多。

  

调用该方法的obj在Express回调之外被实例化的事实如何 - 这是否会影响parallel-ism?

不。

  

最后,影响/强制方法等“在后台运行”的方法是什么?

通常,I / O默认是异步完成的,因此通常不需要强制任何东西在后台运行。它通过节点核心API本身融入到节点设计中。但是,有一些方法可以使用setImmediatesetTimeoutprocess.nextTick将同步处理延迟到未来的事件循环。我在我的博文setTimeout and friends中详细解释了这些。

更确切地说,所有网络都是异步的。故事结局。具体来说,节点核心中可用的API都是异步的,并且节点中根本没有可用的同步API。对于文件系统IO和子进程,有同步和异步API,但同步API必须仅在特殊情况下使用,如果您不自信地知道在这种特定情况下可以进行同步IO API调用,您应该使用异步API,这样就不会破坏使节点执行的lynchpin。