首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Node.js中模拟线程

在Node.js中模拟线程
EN

Stack Overflow用户
提问于 2013-10-15 15:29:38
回答 2查看 704关注 0票数 0

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

现在,Node的单线程体系结构对于这种情况并不理想。理想情况下,我希望生成5-10个“线程”,以尽可能快地处理队列。我看到有一个可以分叉进程的child_process模块,但我从未使用过它。这个模块有帮助吗?

有人能提出解决这个问题的办法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-15 20:01:45

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

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

有一个很大的负面影响:

您需要记住,生成节点进程需要大量的时间和资源,因此通常在一个节点进程内计算数据更快,或者生成工作者子进程来与其通信。正如您可以在文档中看到的那样,您能够从child_process中发送和接收数据,从而使您能够将工作委托给已经生成的childs。

子进程通常与生成它的进程共享相同的stdin和stdout,除非您更改它。看一下文件就知道了。它有很好的文档和易于使用。

工艺文件

我从来没有做过孩子工人,但我做过这样的东西,你可能认为是有用的。

代码语言:javascript
复制
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();
});
票数 2
EN

Stack Overflow用户

发布于 2013-10-15 19:03:01

child_process模块会做您想做的事情。

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

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

代码语言:javascript
复制
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瓶啤酒“歌曲的歌词:

代码语言:javascript
复制
startThread({ doFor: '99' }, function (data) {
  var str = '';
  while (data.doFor) {
    str += data.doFor + ' bottles of beer on the wall ' + data.doFor +
    ' bottles of beer. You take one out, toss it around, ';
    data.doFor--;
    str += data.doFor + ' bottles of beer on the wall\n';
  }
  console.log(str.trim());
}, function (code, outputs) {
  console.log(outputs.join(''));
});

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

数据通过STDOUT和STDERR传递。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19385184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档