【问题标题】:complex data manipulation in node.js using child processes使用子进程在 node.js 中进行复杂的数据操作
【发布时间】:2014-05-07 19:36:57
【问题描述】:

我是 node.js 的新手,并且在我将 Node.js 用于单页应用程序的位置。我必须偶尔做一些非常复杂的数据操作(用于人工智能和统计功能)。这些服务是用 Python 编写的。我正在尝试找出将这些计算交给子进程的最佳方法,这样我的主线程就不会被阻塞,并且我可以使用大量可用的 python 库。

我需要能够将复杂的数据(JSON 对象很好)传递给子进程并接收复杂的输出(JSON 对象也是理想的)。参考Node.js math computation - child process and complex data?,这很简单,另一个 node.js 进程使用 child_process.fork() 和 .send()。

child_process.spawn() 中是否有类似的方法?或者是否可以使用 .fork() 来执行 python 脚本。我所能弄清楚的是如何执行不允许但最简单的参数的系统命令。即使我可以发送数据,我也不清楚如何使用 .spawn() 接收数据。

我在 SO 上找不到这个答案,但我承认 node.js 对我来说是新的。

谢谢。

【问题讨论】:

  • 你也可以使用 zeromq 来做到这一点

标签: javascript python json node.js child-process


【解决方案1】:

spawn 方法返回一个ChildProcess 对象,让您可以访问进程的标准输入和标准输出。

看起来像这样:

var child = require('child_process').spawn('python', ['script.py']);
child.stdout.on('data', function(data)
{
    response = JSON.parse(data);
    console.log(response);
});
child.stdin.write(JSON.stringify(data));

【讨论】:

  • 谢谢!这很棒。
【解决方案2】:

正如 reptilicus 所说,使用 ZeroMQ 来集成 node.js 和 Python 是一种选择。

my SO answer 是一个简单的客户端服务器应用程序通过 ZeroMQ 进行通信的示例。 node.js 中客户端部分的实现应该非常相似,node.js for zeromq binding 存在并且node.js side code 的复杂性(或简单性)与 Python 相当。 (请注意,该链接没有像 Python 中那样提供精确的解决方案,它只是说明了执行类似任务是多么简单)。

【讨论】:

  • 我从来没有听说过这个。乍一看,它似乎很有趣,类似于 Apache Thrift。当两个进程在同一台机器上时使用是否有益?
  • @Apollo 是的,它集成得很好。在同一台机器上,您甚至可以使用 unix 套接字。通过 TCP 用于不同的机器。如果您曾经尝试过所有类型的 iPython 客户端(控制台、GUI、Web),您可能想知道它是如何集成的。答案是 zeromq。
  • 我很欣赏这一点,但我觉得这可能会给我的项目增加比我现在想要处理的复杂性更多的东西。这是“为未来或最后期限而构建”的悖论之一。
  • @Apollo 我理解你的观点。但我可以向你保证,只有两类程序员,一类是还没有尝试过 zeromq,另一类是经常使用它,因为它允许如此轻松地互连。你一试就会看到。就我个人而言,我会担心集成过度生成过程,这会更加棘手并且性能会差一个数量级。
  • 我一定会试一试的。
猜你喜欢
  • 2020-02-27
  • 1970-01-01
  • 1970-01-01
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多