TL;DR
强制保持Node.js进程运行的最好方法是什么,例如,使其事件循环不会运行为空,从而使进程不会终止?我能想到的最好的解决方案是:
const SOME_HUGE_INTERVAL = 1 << 30;
setInterval(() => {}, SOME_HUGE_INTERVAL);
如果您保持间隔时间足够长,它将保持间隔运行,而不会造成太多干扰。
有没有更好的方法呢?
问题的详细版本
我有一个使用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 { };
}
}
我能想到的唯一解决方案是注册一个具有较长时间间隔的计时器来调用一个空函数,这只是为了让调度器保持忙碌,并避免让事件循环为空,从而使进程永远运行。
有没有比我做得更好的方法?也就是说,在不必使用这种“黑客”的情况下,保持进程运行?
发布于 2017-11-23 21:33:47
最简单、干扰最少的解决方案
老实说,我认为我的方法是最不具侵入性的:
setInterval(() => {}, 1 << 30);
这将设置一个无害的间隔,大约每12天触发一次,实际上什么也不做,只是保持进程运行。
最初,我的解决方案使用
Number.POSITIVE_INFINITY
作为句点,所以计时器实际上永远不会触发,但最近API更改了这一行为,现在它不接受任何大于2147483647的值(即2 ** 31 - 1
__)。请参阅文档和。
对其他解决方案的评论
作为参考,以下是到目前为止给出的另外两个答案:
Joe的(从那时起被删除,但完全有效):
require('net').createServer().listen();
将创建一个他所说的“假监听器”。一个小缺点是,我们会为此分配一个端口。
雅各布的:
process.stdin.resume();
或者是等效的:
process.stdin.on("data", () => {});
将stdin
置于“旧”模式,这是Node.js中仍然存在的一个不推荐使用的功能,以便与在Node.js v0.10 (reference)之前编写的脚本兼容。
我建议你不要这么做。它不仅被弃用了,而且还不必要地扰乱了标准输入。
发布于 2014-05-13 11:59:43
使用"old" Streams mode监听永远不会出现的标准输入:
// Start reading from stdin so we don't exit.
process.stdin.resume();
发布于 2021-03-15 06:09:57
您可以使用setTimeout(function() {""},1000000000000000000);
命令使脚本保持活动状态,而不会超载。
https://stackoverflow.com/questions/23622051
复制相似问题