首页 > 解决方案 > 如何在节点js子进程中进行多线程

问题描述

我有一个使用唯一 ID 多次调用的 bash 脚本,并且我使用套接字 io在 stdout 函数上发送消息

shell 脚本包含两个动作:

  1. 行动1
  2. 行动2

Action2 是一个后台进程,所以我不想等待脚本完成,所以当 Action1 完成时,我打印回显消息(msg),我将在 stdout 函数中捕获它,然后我在 stdout 中发送套接字 io 消息功能

服务器.js

child_process = exec('bash some-file.sh arg1 arg2')

child_process.stdout.on('data', function) {
  if ((data).indexOf(msg) > 1) {
    io.sockets.emit('Completed for id: ' + id)
  }
});

上述代码的问题是,当我多次调用上述操作时,它不适用于第二次迭代(即 id 1 仍然存在),因为后台操作 (Action2) 仍在后台为 id 1 运行。

如何在 child_process 上进行多线程处理?

标签: node.jsmultithreadingchild-process

解决方案


您可以使用child_process.fork和发送来自子流程的消息(Actions2)

main.js

const child_proc = require('child_process');
const sub = child_proc.fork(`${__dirname}/sub.js`);
sub.on('message', (m) => {
  console.log('PARENT got message:', m);
});
sub.send({ from: 'server' });

子.js

process.on('message', (m) => {
  console.log('CHILD got message:', m);
});
process.send({ from: 'client' });

这是文档一篇很好的文章解释了它


推荐阅读