首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NodeJS子进程退出行为

NodeJS子进程退出行为
EN

Stack Overflow用户
提问于 2020-08-03 21:11:45
回答 1查看 66关注 0票数 0

我有一些(对我来说)奇怪的行为,我不明白。请帮帮忙。

这里是父进程test-parent.js

代码语言:javascript
复制
const cp = require('child_process');
const path = require('path');

const fork = cp.fork(path.join(__dirname, 'test-child.js'));

fork.on('message', console.log);
fork.on('exit', (code) => {
  console.log('Exited with code:', code);
});

fork.send({ sum: 0, set: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, - 1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11] });

在这里有一个子集(使用cpu-bound子集和算法) test-child.js

代码语言:javascript
复制
const subsetSumFactory = require('./subset-sum');

process.on('message', (message) => {
  const subsetSum = subsetSumFactory(message.sum, message.set);

  subsetSum.on('match', (subset) => { });

  subsetSum.on('end', (totalSubsets) => {
    process.send({ event: 'end', data: { totalSubsets, pid: process.pid } });
  });

  subsetSum.start();
});

如果我运行父代码,我从孩子那里得到了正确的消息,而孩子等待另一条消息。

所以我不明白的一点是,为什么子进程在运行后没有立即退出,而是等待来自父进程的消息。因为如果我只运行子代码:node test-child.js,它会立即退出。

更新

感谢所有人的回答。

请再解释一件事。如果我在子目录中替换

process.on('message', ...)process.once('message', ...)

然后从孩子那里得到响应,然后得到Exited with code: 0

为什么?我没有显式地杀伤子进程...

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-04 17:26:05

因此,我决定自己回答,因为其他答案并没有完全阐明情况。

我只是测试了一些代码,发现了一些有趣的事情。例如,如果我们有包含一些代码的子进程:

process.send({message: 'foo'})或简单的console.log('foo')

它会立即退出。

但是有一些流程事件,在这些事件上,如果您有侦听器回调,它会阻止子流程退出。例如process.on('message', ...)process.on('disconnect', ...)

现在process.once('message', ...)的情况很清楚了。它只是在触发一次后删除侦听器。所以现在,如果没有listener,就没有什么能阻止子进程退出。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63230102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档