一尘不染

Node.js产生子进程并实时输出终端

node.js

我有一个脚本,输出“ hi”,睡眠一秒钟,输出“ hi”,睡眠1秒,依此类推。现在,我认为我可以使用此模型解决此问题。

var spawn = require('child_process').spawn,
temp    = spawn('PATH TO SCRIPT WITH THE ABOVE BEHAVIOUR');

temp.stdout.pipe(process.stdout);

现在的问题是,需要完成任务才能显示输出。据我了解,这是由于新产生的进程接受了执行控制。显然,node.js不支持线程,那么有什么解决方案吗?我的想法是可能运行两个实例,第一个实例用于创建任务的特定目的,并考虑到可以实现的目的,将其通过管道将输出传递给第二个实例的进程。


阅读 309

收藏
2020-07-07

共1个答案

一尘不染

我仍然对Node.js感兴趣,但是我有一些想法。首先,我相信您需要使用execFile而不是spawn;
execFile用于您具有脚本路径的路径,而spawn用于执行Node.js可以针对您的系统路径解析的众所周知的命令。

1.

提供一个回调来处理缓冲的输出:

var child = require('child_process').execFile('path/to/script', [ 
    'arg1', 'arg2', 'arg3', 
], function(err, stdout, stderr) { 
    // Node.js will invoke this callback when process terminates.
    console.log(stdout); 
});

2.将侦听器添加到子进程的stdout

9thport.net

var child = require('child_process').execFile('path/to/script', [ 
    'arg1', 'arg2', 'arg3' ]); 
// use event hooks to provide a callback to execute when data are available: 
child.stdout.on('data', function(data) {
    console.log(data.toString()); 
});

此外,似乎存在一些选项,您可以从其中将生成的进程与Node的控制终端分离,这将使其可以异步运行。我还没有测试过,但是API文档中有一些例子如下:

child = require('child_process').execFile('path/to/script', [ 
    'arg1', 'arg2', 'arg3', 
], { 
    // detachment and ignored stdin are the key here: 
    detached: true, 
    stdio: [ 'ignore', 1, 2 ]
}); 
// and unref() somehow disentangles the child's event loop from the parent's: 
child.unref(); 
child.stdout.on('data', function(data) {
    console.log(data.toString()); 
});
2020-07-07