在Node.js中使用子进程进行复杂数据处理

2 投票
2 回答
2082 浏览
提问于 2025-04-18 05:43

我刚开始接触node.js,现在正在用它做一个单页应用。偶尔我需要进行一些非常复杂的数据处理(比如AI和统计功能),这些服务是用Python写的。我想找出最好的方法,把这些计算交给一个子进程,这样我的主线程就不会被阻塞,同时我也能利用丰富的Python库。

我需要能够把复杂的数据(一个JSON对象就可以)传递给子进程,并且接收复杂的输出(同样,一个JSON对象是最理想的)。参考一下Node.js数学计算 - 子进程和复杂数据?,用另一个node.js进程通过child_process.fork()和.send()来实现这个是相对简单的。

那在child_process.spawn()中有没有类似的方法?或者说能不能用.fork()来执行一个Python脚本?我目前只知道怎么执行系统命令,但这只能处理最简单的参数。即使我能发送数据,我也不太清楚怎么用.spawn()来接收数据。

我在Stack Overflow上找不到这个答案,不过我承认node.js对我来说还是很新。

谢谢。

2 个回答

1

正如reptilicus提到的,使用ZeroMQ来连接node.js和Python是一个不错的选择。

我的回答中,有一个简单的客户端和服务器应用程序的例子,它们通过ZeroMQ进行通信。node.js的客户端部分实现起来会非常相似,node.js的ZeroMQ绑定已经存在,而node.js的代码示例的复杂程度(或者简单程度)和Python的代码是可以比较的。(注意,这个链接并没有提供和Python完全一样的解决方案,只是展示了做类似任务是多么简单。)

2

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));

撰写回答