Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript nodejs子进程:实时写入标准输出并按顺序运行_Javascript_Node.js_Child Process - Fatal编程技术网

Javascript nodejs子进程:实时写入标准输出并按顺序运行

Javascript nodejs子进程:实时写入标准输出并按顺序运行,javascript,node.js,child-process,Javascript,Node.js,Child Process,信息 节点:v9.4.0 我希望按顺序运行外部命令,但可以实时查看标准输出 我在下面写了一个例子。这是为了将所有测试用例放入./test/中,然后逐个运行。在本例中,stdout是实时编写的,但所有测试用例都是同时运行的,这是一个问题 const spawn = require('child_process').spawn; const fs = require('fs'); let test; fs.readdirSync('./test/').forEach(file => {

信息 节点:v9.4.0

我希望按顺序运行外部命令,但可以实时查看标准输出

我在下面写了一个例子。这是为了将所有测试用例放入./test/中,然后逐个运行。在本例中,stdout是实时编写的,但所有测试用例都是同时运行的,这是一个问题

const spawn = require('child_process').spawn;
const fs = require('fs');
let test;

fs.readdirSync('./test/').forEach(file => {
    test = spawn('npm', ['test', 'test/' + file]);

    test.stdout.on('data', (data) => {
        console.log(`${data}`);
    }); 

    test.stderr.on('data', (data) => {
        console.log(`${data}`);
    }); 

    test.on('close', (code) => {
        console.log(`code: ${code}`);
    }); 
});
你能告诉我如何同时做到这两件事吗? -逐个运行所有测试用例 -实时编写标准输出


有人可能会想,为什么我必须一个接一个地运行测试。这是因为这些测试用例要求我使用远程服务器,而远程服务器不能很好地处理并行任务。服务器不在我的控制之下,因此我尝试在node js脚本中管理它。

在生成每个进程之前,您可以使用js和lock中的承诺模拟异步操作的互斥锁,并在进程结束时解锁:

class Mutex {
  constructor() {
    this._queue = [];
  }

  lock() {
    return new Promise((resolve, reject) => {
      const allow = () => {
        resolve(this._unlock.bind(this));
      };
      this._queue.push(allow);
      if (this._queue.length === 1) {
        allow();
      }
    });
  }

  _unlock() {
    this._queue.shift();
    const next = this._queue[0];
    if (typeof next === 'function') {
      next();
    }
  }
}
然后您的代码变成:

const spawn = require('child_process').spawn;
const fs = require('fs');
let test;

const mutex = new Mutex();

fs.readdirSync('./test/').forEach(async file => {
    const unlock = await mutex.lock();

    test = spawn('npm', ['test', 'test/' + file]);

    test.stdout.on('data', (data) => {
        console.log(`${data}`);
    }); 

    test.stderr.on('data', (data) => {
        console.log(`${data}`);
    }); 

    test.on('close', (code) => {
        unlock();
        console.log(`code: ${code}`);
    }); 
});

您使用的节点版本是什么?版本是v9.4.0。我在问题中添加了此信息。代码没有按原样工作。节点未识别该互斥类。不过,这一概念已经售出。在npm安装了异步互斥并对该模块进行了一些调整之后,它工作得很好。