Node.js 错误:IPC通道已断开连接
我应该在何处/何时发现此错误Node.js 错误:IPC通道已断开连接,node.js,Node.js,我应该在何处/何时发现此错误 Error: IPC channel is already disconnected 这是在我多次调用.disconnect时使用集群模块从子进程调用的。我知道我不应该叫它两次或更多,但有时我无法控制它。最终如何避免多次拨打此电话?此代码不起作用: try { if (worker.state !== "disconnected" && worker.state !== "dead") { worker.disconnect();
Error: IPC channel is already disconnected
这是在我多次调用.disconnect时使用集群模块从子进程调用的。我知道我不应该叫它两次或更多,但有时我无法控制它。最终如何避免多次拨打此电话?此代码不起作用:
try {
if (worker.state !== "disconnected" && worker.state !== "dead") {
worker.disconnect();
}
} catch (error) {}
编辑:
这是此错误的堆栈跟踪:
events.js:71
throw arguments[1]; // Unhandled 'error' event
^
Error: IPC channel is already disconnected
at process.target.disconnect (child_process.js:392:26)
at ProgressTracker.callback (cluster.js:437:20)
at ProgressTracker.check (cluster.js:94:32)
at Object.Worker.disconnect [as 44:2] (cluster.js:445:16)
at handleResponse (cluster.js:149:41)
at respond (cluster.js:170:5)
at handleMessage (cluster.js:180:5)
at process.EventEmitter.emit (events.js:126:20)
at handleMessage (child_process.js:269:12)
at Pipe.channel.onread (child_process.js:293:9)
此错误应在辅助文件中处理。例如,使用此代码:
process.on("uncaughtException", function (error) {
if (error.toString() !== 'Error: IPC channel is already disconnected') {
process.stderr.write(error.stack);
process.exit(1);
}
});
从父脚本捕获该脚本的所有尝试均未成功。
我希望这能帮助别人解决这个问题。这个错误应该在worker文件中处理。例如,使用此代码:
process.on("uncaughtException", function (error) {
if (error.toString() !== 'Error: IPC channel is already disconnected') {
process.stderr.write(error.stack);
process.exit(1);
}
});
从父脚本捕获该脚本的所有尝试均未成功。
我希望这有助于某人处理此问题。您应该使用worker.shrighter来防止呼叫。断开多次连接:
if (!cluster.worker.suicide) {
cluster.worker.disconnect();
}
通过调用.kill或.disconnect进行设置,直到它未定义为止
您应该使用worker.sequestion来阻止呼叫。断开多次连接:
if (!cluster.worker.suicide) {
cluster.worker.disconnect();
}
通过调用.kill或.disconnect进行设置,直到它未定义为止
这是一篇老文章,但我在项目中遇到了这个问题 我发现worker.Shumble api现在已被弃用,请参阅: 现在建议使用worker.exitedAfterDisconnect请参阅: 因此,以基里尔·日尔诺夫为例:
if (!cluster.worker.suicide) {
cluster.worker.disconnect();
}
将成为:
if (!cluster.worker.exitedAfterDisconnect) {
cluster.worker.disconnect();
}
exitedAfterDisconnect将是未定义的,直到对辅助进程调用.kill或.disconnect,然后才是真的。有点老了,但我在项目中遇到了这个问题 我发现worker.Shumble api现在已被弃用,请参阅: 现在建议使用worker.exitedAfterDisconnect请参阅: 因此,以基里尔·日尔诺夫为例:
if (!cluster.worker.suicide) {
cluster.worker.disconnect();
}
将成为:
if (!cluster.worker.exitedAfterDisconnect) {
cluster.worker.disconnect();
}
exitedAfterDisconnect将是未定义的,直到对辅助进程调用.kill或.disconnect,然后它将为true。
在NodeJS 7.10和NodeJS 8.0中测试
如何检查:
如果child.connected{
断开连接;
}
未断开连接的子进程:
子进程{
域:
领域{
域:空,
_事件:{error:[函数:debugDomainError]},
_事件提示:1,
_maxListeners:未定义,
成员:[]},
_事件:{internalMessage:[函数]},
_事件提示:1,
_maxListeners:未定义,
_关闭所需时间:2,
_关闭日期:0,
是的,
信号代码:空,
exitCode:null,
被杀:错,
生成文件:'/usr/bin/nodejs',
_句柄:进程{owner:[Circular],onexit:[Function],pid:25424},
spawnargs:['/usr/bin/nodejs','./dist/child.js'],
pid:25424,
stdin:null,
stdout:null,
stderr:null,
stdio:[null,null,null,null],
频道:
烟斗{
字节:0,
_外部流:{},
fd:14,
writeQueueSize:0,
缓冲:false,
onread:[函数],
套接字:{got:{},send:{},
_通道:[Getter/Setter],
_handleQueue:null,
_pendingHandle:null,
发送:[函数],
_发送:[函数],
断开连接:[功能],
_断开连接:[函数]}
已断开连接的子进程:
子进程{
域:
领域{
域:空,
_事件:{error:[函数:debugDomainError]},
_事件提示:1,
_maxListeners:未定义,
成员:[]},
_事件:{internalMessage:[函数]},
_事件提示:1,
_maxListeners:未定义,
_关闭所需时间:2,
_关闭日期:1,
联系:错,
信号代码:空,
出口代码:0,
被杀:错,
生成文件:'/usr/bin/nodejs',
_句柄:null,
spawnargs:['/usr/bin/nodejs','./dist/child.js'],
pid:25424,
stdin:null,
stdout:null,
stderr:null,
stdio:[null,null,null,null],
频道:空,
_通道:[Getter/Setter],
_handleQueue:null,
_pendingHandle:null,
发送:[函数],
_发送:[函数],
断开连接:[功能],
_断开连接:[函数]}
在NodeJS 7.10和NodeJS 8.0中测试
如何检查:
如果child.connected{
断开连接;
}
未断开连接的子进程:
子进程{
域:
领域{
域:空,
_事件:{error:[函数:debugDomainError]},
_事件提示:1,
_maxListeners:未定义,
成员:[]},
_事件:{internalMessage:[函数]},
_事件提示:1,
_maxListeners:未定义,
_关闭所需时间:2,
_关闭日期:0,
是的,
信号代码:空,
exitCode:null,
被杀:错,
生成文件:'/usr/bin/nodejs',
_句柄:进程{owner:[Circular],onexit:[Function],pid:25424},
spawnargs:['/usr/bin/nodejs','./dist/child.js'],
pid:25424,
stdin:null,
stdout:null,
stderr:null,
stdio:[null,null,null,null],
频道:
烟斗{
字节:0,
_外部流:{},
fd:14,
writeQueueSize:0,
缓冲:false,
onread:[函数],
套接字:{got:{},send:{},
_通道:[Getter/Setter],
_handleQueue:null,
_pendingHandle:null,
发送:[函数],
_发送:[函数],
断开连接:[功能],
_断开连接:[函数]}
已断开连接的子进程:
子进程{
域:
领域{
域:空,
_事件:{error:[函数:debugDomainError]},
_事件提示:1,
_maxListeners:未定义,
成员:[]},
_事件:{internalMessage:[函数]},
_事件提示:1,
_maxListeners:未定义,
_关闭所需时间:2,
_关闭日期:1,
联系:错,
信号代码:空,
出口代码:0,
被杀:错,
生成文件:'/usr/bin/nodejs',
_句柄:null,
spawnargs:['/usr/bin/nodejs','./dist/child.js'],
pid:25424,
stdin:null,
stdout:null,
stderr:null,
stdio:[null,null,null,null],
频道:空,
_通道:[Getter/Setter],
_handleQueue:null,
_pendingHandle:null,
发送:[函数],
_发送:[函数],
断开连接:[功能],
_断开连接:[函数]}
域已弃用。域已弃用。