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

在Node.js中执行并行处理的最佳方法

缑泓
2023-03-14
问题内容

我正在尝试编写一个小型节点应用程序,该应用程序将搜索并解析文件系统上的大量文件。为了加快搜索速度,我们尝试使用某种类型的map
reduce。该计划将是以下简化方案:

  • Web请求带有搜索查询
  • 启动3个进程,每个进程分配1000个(不同)文件
  • 进程完成后,它将“返回”结果回到主线程
  • 一旦所有进程完成,主线程将通过返回组合结果作为JSON结果来继续

我对此有以下疑问: 这在Node中可行吗? 推荐的做法是什么?

我一直在摆弄,但接下来没有使用Process的示例了:

发起人:

function Worker() { return child_process.fork("myProcess.js); }
for(var i = 0; i < require('os').cpus().length; i++){
        var process = new Worker();
        process.send(workItems.slice(i * itemsPerProcess, (i+1) * itemsPerProcess));
}

myProcess.js

process.on('message', function(msg) {
    var valuesToReturn = [];
    // Do file reading here
    //How would I return valuesToReturn?
    process.exit(0);
}

旁注:

  • 我知道进程数应取决于服务器上的CPU数
  • 我也知道文件系统中的速度限制。在将其移至数据库或Lucene实例之前,请先考虑一下概念证明:-)

问题答案:

应该可行。作为一个简单的例子:

// parent.js
var child_process = require('child_process');

var numchild  = require('os').cpus().length;
var done      = 0;

for (var i = 0; i < numchild; i++){
  var child = child_process.fork('./child');
  child.send((i + 1) * 1000);
  child.on('message', function(message) {
    console.log('[parent] received message from child:', message);
    done++;
    if (done === numchild) {
      console.log('[parent] received all results');
      ...
    }
  });
}

// child.js
process.on('message', function(message) {
  console.log('[child] received message from server:', message);
  setTimeout(function() {
    process.send({
      child   : process.pid,
      result  : message + 1
    });
    process.disconnect();
  }, (0.5 + Math.random()) * 5000);
});

因此,父进程产生X个子进程,并向其传递消息。它还安装了一个事件处理程序,以侦听从子级发送回的任何消息(例如,结果)。

子进程等待来自父进程的消息,然后开始处理(在这种情况下,它只是启动一个具有随机超时的计时器来模拟正在完成的工作)。完成后,它将结果发送回父进程,并用于process.disconnect()将自身与父进程断开连接(基本上停止子进程)。

父进程跟踪已启动的子进程的数量以及已发回结果的子进程的数量。当这些数字相等时,父级从子级进程接收所有结果,因此它可以合并所有结果并返回JSON结果。



 类似资料:
  • 我有一个超时执行任务的方法。我使用ExecutorServer.submit()获取一个Future对象,然后调用future.get()并超时。这很好,但是我的问题是处理我的任务可能抛出的检查异常的最好方法。下面的代码工作正常,并且保留了被检查的异常,但是如果方法签名中被检查的异常的列表改变了,它看起来非常笨拙并且容易出错。 关于如何解决这个问题的任何建议?我需要以Java 5为目标,但我也很好

  • 问题内容: 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可以求和元

  • 问题内容: 在下面的代码中,我试图一次性进行多个(大约10个)HTTP请求和RSS解析。 我在需要访问和解析结果的URI数组上使用标准构造。 码: 我了解一次调用函数时,应该使用回调。但是,在此示例中,我唯一想到使用回调的方法是调用一个函数,该函数对被调用的次数进行计数,并且仅在被调用的次数与看起来很hacky 的次数相同时才继续。 所以我的问题是, 在node.js中处理这种情况的最佳方法 是

  • 问题内容: 我是Node的新手,并试图确保我对JSON驱动的Web应用程序使用了合理的设计。 我已经在Redis中存储了一堆数据,并且正在通过node检索它们,并将结果从Redis中流出来。这是我正在做的一个很好的例子: 本质上,我是从Redis获取一组密钥,然后请求每个密钥,然后将结果流式传输到半手动创建的JSON(来自Redis的字符串已经在JSON中)。现在,这很好用,但是我不禁会以为i =

  • 问题内容: 几天前我才开始尝试使用node.js。我意识到只要程序中有未处理的异常,Node就会终止。这与我所见过的普通服务器容器不同,在普通服务器容器中,当发生未处理的异常时,只有工作线程死亡,并且容器仍然能够接收请求。这引起了一些问题: 是唯一有效的预防方法吗? 在执行异步过程期间也会捕获未处理的异常吗? 是否存在已经构建的模块(例如发送电子邮件或写入文件),在未捕获的异常的情况下可以利用该模