Javascript 在Node.js中模拟线程

Javascript 在Node.js中模拟线程,javascript,node.js,Javascript,Node.js,我有一个Node.js应用程序,它基本上缓存来自web服务的数据。 我还有一个队列,接收大约500个需要尽快处理的项目。通过处理,我的意思是,它们中的每一个都代表一个要发出的HTTP请求及其要缓存的响应 现在,节点的单线程体系结构并不适合这种情况。理想情况下,我希望生成5-10个“线程”,以尽快处理队列。我读到有一个child\u进程模块可以分叉进程,但我从未使用过它。这个模块有帮助吗 有人能为这个问题提出解决方案吗?子进程模块会在某种程度上满足您的需求 唯一的问题是,你确实产生了新的进程,因此

我有一个Node.js应用程序,它基本上缓存来自web服务的数据。 我还有一个队列,接收大约500个需要尽快处理的项目。通过处理,我的意思是,它们中的每一个都代表一个要发出的HTTP请求及其要缓存的响应

现在,节点的单线程体系结构并不适合这种情况。理想情况下,我希望生成5-10个“线程”,以尽快处理队列。我读到有一个
child\u进程
模块可以分叉进程,但我从未使用过它。这个模块有帮助吗


有人能为这个问题提出解决方案吗?

子进程模块会在某种程度上满足您的需求

唯一的问题是,你确实产生了新的进程,因此,你必须考虑内存开销。假设您希望在同一个文件中定义子例程,那么可以将JavaScript字符串传递给

节点
命令

所以这正是我们要做的。但首先,让我们创建一个接受JSON兼容对象的函数和一个函数,然后在新线程上运行该函数:

var child_process = require('child_process');

function startThread(data, fn, callback) {
  var fnStr = '(' + fn.toString() + ')(' + JSON.stringify(data) + ');';

  var node = child_process.spawn('node', ['-e', fnStr]);

  var output = [];

  var onData = function (data) {
    output.push(data.toString('utf8').trim());
  };

  node.stdout.on('data', onData);
  node.stderr.on('data', onData);

  node.on('close', function (code) {
    callback(code, output);
  });
}
例如,我们将生成一个新线程来生成“99瓶啤酒”歌曲的歌词:

不幸的是,将在另一个“线程”中使用的函数无法访问父线程中的变量


而且,数据通过STDOUT和STDERR传递。

子进程只是运行相同或不同脚本的新节点进程的分支。 您也可以使用该api生成系统进程,但这不是我在这里描述的

它们的行为就像真正的nodejs进程,因为它们就是这样

有一个很大的负面影响:

您需要记住,生成节点进程需要花费大量的时间和资源,因此通常在一个节点进程内计算数据或生成工作子进程以与之通信会更快。正如您在文档中所看到的,您能够从child_进程发送和接收数据,这使得您能够将工作委托给已经生成的child

子进程通常与生成它的进程共享相同的stdin和stdout,除非您更改它。请看一下文档。它有很好的文档记录,并且易于使用

我从来没有制造过工人小孩,但我做过这样的东西,也许你认为有用。< /P>
if (process.argv.indexOf("child") == -1) {
  process.chdir(module.filename.replace(/\/[^\/]+$/, ""));
  var child;
  var spawn = function () {
    console.log("spawning child process " + new Date());
    child = require("child_process").fork(module.filename, ["child"]);
    child.on("close", function () {
      spawn();
    });
  }
  spawn();

  process.on("exit", function () {
    child.kill();
  });
  return;
}

// child code begins here

var fs = require("fs");

fs.watch(process.argv[1], function () {
  process.exit();
});

节点中的任何异步IO都是使用后台线程生成的。此外,Node可以处理比Apache更大的数据量,因此只有当您达到一个荒谬的请求数量时,您才应该考虑分叉进程:)我同意+gustavohenke。在大多数情况下,只要使用setTimeout和setInterval就可以防止阻塞。如果出于任何原因必须创建子进程,请查看以下内容:。另外,最新的node.js版本有一个测试版实现,用于在相同端口上侦听的node.js进程集群,有关更多信息,请查看这里:大家好。这里的问题不是并发性。这是关于处理速度的问题。我已经使用setTimeout了。问题是我需要尽快处理这些项目。这就是我研究“线程”的原因。例如,如果我有5个线程处理队列,那么它将比我现在拥有的快得多。您可能希望遵循StMotorSpark关于child_进程和集群方法的回答。您所描述的是非常可行的,您只需将其视为一个多进程模型,而不是多线程模型。@Thomas您是在假设Node处理此类工作负载的速度,还是实际进行了基准测试并得出需要多线程/处理的结论?您的目标速度(以请求/秒计)是多少?
if (process.argv.indexOf("child") == -1) {
  process.chdir(module.filename.replace(/\/[^\/]+$/, ""));
  var child;
  var spawn = function () {
    console.log("spawning child process " + new Date());
    child = require("child_process").fork(module.filename, ["child"]);
    child.on("close", function () {
      spawn();
    });
  }
  spawn();

  process.on("exit", function () {
    child.kill();
  });
  return;
}

// child code begins here

var fs = require("fs");

fs.watch(process.argv[1], function () {
  process.exit();
});