如何强制保持Node.js进程终止?
TL; DR
什么是强制保持Node.js进程正常运行的最佳方式,即保持其事件循环不会空着,从而避免进程终止? 我能想出的最佳解决方案是:
setInterval(() => {}, Number.POSITIVE_INFINITY);
有没有更好的方法来做到这一点?
问题的长版本
我有一个使用Edge.js的Node.js脚本来注册一个回调函数,以便它可以从.NET中的DLL中调用。 这个功能将被称为每秒1次,发送一个简单的序列号,应该打印到控制台。
Edge.js部分很好,一切正常。 我唯一的问题是,我的Node.js进程执行它的脚本,然后它将耗尽事件来处理。 在事件循环为空的情况下,它只是终止,忽略了它应该保持运行以便能够从DLL接收回调的事实。
我的Node.js脚本:
var
edge = require('edge');
var foo = edge.func({
assemblyFile: 'cs.dll',
typeName: 'cs.MyClass',
methodName: 'Foo'
});
// The callback function that will be called from C# code:
function callback(sequence) {
console.info('Sequence:', sequence);
}
// Register for a callback:
foo({ callback: callback }, true);
// My hack to keep the process alive:
setInterval(function() {}, 60000);
我的C#代码(DLL):
public class MyClass
{
Func<object, Task<object>> Callback;
void Bar()
{
int sequence = 1;
while (true)
{
Callback(sequence++);
Thread.Sleep(1000);
}
}
public async Task<object> Foo(dynamic input)
{
// Receives the callback function that will be used:
Callback = (Func<object, Task<object>>)input.callback;
// Starts a new thread that will call back periodically:
(new Thread(Bar)).Start();
return new object { };
}
}
我能想到的唯一解决方案是注册一个长时间间隔的定时器来调用一个空函数,只是为了保持调度器繁忙并避免让事件循环为空,以便该过程一直运行。
有没有办法比我做得更好? 也就是说,让流程继续运行而不必使用这种“黑客”?
使用“旧”Streams模式来监听永远不会来的标准输入:
// Start reading from stdin so we don't exit.
process.stdin.resume();
尽管看起来这个问题没有正确的答案,但到目前为止,我们有3种可能的黑客攻击,并且我诚实地认为我的方法不那么具有侵入性:
setInterval(() => {}, Number.POSITIVE_INFINITY);
这将设置一个永远不会触发的时间间隔。 有趣的是,如果给定Number.POSITIVE_INFINITY
作为其超时参数,那么setTimeout()
不会相同,并且根本不会计划。
作为参考,以下是迄今给出的另外两个答案:
乔:
require('net').createServer().listen();
就像他所说的那样,将创建一个“假听者”。 一个小缺点是我们会为此分配一个端口。
雅各布:
process.stdin.resume();
或者相当于:
process.stdin.on("data", () => {});
将stdin
置于“旧”模式,这是为了与Node.js v0.10(参考)之前编写的脚本兼容而存在于Node.js中的弃用功能。
上一篇: How to forcibly keep a Node.js process from terminating?
下一篇: What's the most efficient way to prevent a node.js script from terminating?