当前位置: 首页 > 面试题库 >

Node.js中的并行任务

宇文鸿畴
2023-03-14
问题内容

我有一些我想在JS中做的资源密集型任务。对于这个问题,让我们假设它们是一些繁重的计算,而不是系统访问。现在,我想同时运行任务A,B和C,并在完成后执行一些功能D。

该异步库为此提供了一个很好的脚手架:

async.parallel([A, B, C], D);

如果我正在做的只是计算,那么它将仍然同步运行(除非库将任务本身放在不同的线程上,我希望情况并非如此)。我如何使它实际上是平行的?异步代码通常不阻止调用者的事情是什么(使用NodeJS时)?是否开始子进程?


问题答案:

我如何使它实际上是平行的?

首先,在单节点应用程序中您实际上不会并行运行。节点应用程序在单个线程上运行,并且节点的事件循环一次仅处理一个事件。即使在多核计算机上运行,​​您也不会在节点应用程序中获得并行处理。

也就是说,您可以通过将代码分叉到单独的节点进程中或通过生成子进程来在多核计算机上实现并行处理。实际上,这允许您创建节点本身的多个实例,并以不同的方式(例如,stdout,进程派生IPC机制)与这些进程进行通信。此外,您可以选择将功能(按职责)分离到各自的节点应用程序/服务器中,并通过RPC进行调用。

异步 代码通常不阻止调用者的事情是什么(使用NodeJS时)? 它开始一个子进程吗?

它没有开始新的过程。在下面,当在node.js中使用async.parallel时,它正在使用process.nextTick()。并且nextTick()允许您通过将工作推迟到新的堆栈上来避免阻塞调用者,从而可以交织cpu密集型任务等。

长话短说

节点无法轻松实现“开箱即用”的多处理器并发。相反,Node为您提供了非阻塞设计和事件循环,该事件循环利用线程而不共享内存。多个线程不能共享数据/内存,因此不需要锁。节点是无
锁的 。一个节点进程利用一个线程,这使节点既安全又强大。

当您需要在多个进程之间分配工作时,请使用某种消息传递方式与其他进程/服务器进行通信。 例如IPC / RPC。

有关更多信息,请参见:

SO关于什么是Node.js给出了很棒的答案…很好。

了解process.nextTick()



 类似资料:
  • 假设我有几个任务要在Java中并行运行。每个任务要么返回成功,要么返回失败。每个任务都有一个相关的截止日期。如果任务未在截止日期前完成,它将被中断(所有任务都可中断)并返回失败。 如果其中一个任务失败(即返回失败),我们将中断所有仍在运行的其他任务。 我们应该等到所有任务都完成,最后如果所有任务都返回成功,则返回成功;如果至少有一个任务返回失败,则返回失败。 你将如何实施它?我将使用util。同时

  • 问题内容: 我正在使用python 2.7,我有一些看起来像这样的代码: 此处唯一的依赖项如下:dependent1需要等待任务1-3,Dependent2需要等待任务4-6,而dependent3需要等待依赖项1-2 …以下是可以的:首先运行全部6个任务并行,然后是前两个从属。 我希望尽可能多的任务并行运行,我已经在Google上搜索了一些模块,但是我希望避免使用外部库,并且不确定队列线程技术如

  • 问题内容: node.js的事件驱动编程模型使协调程序流变得有些棘手。 简单的顺序执行变成嵌套的回调,这很容易(尽管有些麻烦以至于要写下来)。 但是并行执行如何?假设您有三个可以并行运行的任务A,B,C,当它们完成后,您要将其结果发送给任务D。 对于前叉/连接模型,这将是 fork A fork B fork C join A,B,C, run D 我该如何在node.js中编写它?是否有最佳做法

  • 本文向大家介绍数据并行与任务并行,包括了数据并行与任务并行的使用技巧和注意事项,需要的朋友参考一下 数据并行 数据并行意味着在每个多个计算核心上并发执行同一任务。 让我们举个例子,对大小为N的数组的内容求和。对于单核系统,一个线程将简单地对元素[0]求和。。。[N-1]。但是,对于双核系统,在核0上运行的线程A可以对元素[0]求和。。。[N / 2-1],而在核心1上运行的线程B可以求和元素[N

  • 本文向大家介绍Python中运行并行任务技巧,包括了Python中运行并行任务技巧的使用技巧和注意事项,需要的朋友参考一下 示例 标准线程多进程,生产者/消费者示例: Worker越多,问题越大 map Map能够处理集合按顺序遍历,最终将调用产生的结果保存在一个简单的集合当中。

  • 我正试图找到一种很好的并行化代码的方法,对大数据集进行处理,然后将结果数据导入RavenDb。 数据处理是CPU绑定和数据库导入IO绑定。 我正在寻找一种在环境上并行处理的解决方案。ProcessorCount线程数。然后应将生成的数据导入到与上述进程并行的x(假设10)池化线程上的RavenDb中。 这里的主要问题是我希望在导入完成的数据时继续处理,以便在等待导入完成时继续处理下一个数据集。 另