首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何强制阻止Node.js进程终止?

如何强制阻止Node.js进程终止?
EN

Stack Overflow用户
提问于 2014-05-13 10:50:30
回答 4查看 25.9K关注 0票数 57

TL;DR

强制保持Node.js进程运行的最好方法是什么,例如,使其事件循环不会运行为空,从而使进程不会终止?我能想到的最好的解决方案是:

代码语言:javascript
复制
const SOME_HUGE_INTERVAL = 1 << 30;
setInterval(() => {}, SOME_HUGE_INTERVAL);

如果您保持间隔时间足够长,它将保持间隔运行,而不会造成太多干扰。

有没有更好的方法呢?

问题的详细版本

我有一个使用Edge.js的Node.js脚本来注册一个回调函数,这样它就可以从.NET中的DLL内部调用。这个函数每秒会被调用1次,发送一个应该打印到控制台的简单序列号。

Edge.js部分很好,一切都正常。我唯一的问题是,我的Node.js进程执行它的脚本,之后它会耗尽所有要处理的事件。当它的事件循环为空时,它只是终止,忽略了它应该一直运行以能够接收来自DLL的回调的事实。

我的Node.js脚本:

代码语言:javascript
复制
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):

代码语言:javascript
复制
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 { };
    }
}

我能想到的唯一解决方案是注册一个具有较长时间间隔的计时器来调用一个空函数,这只是为了让调度器保持忙碌,并避免让事件循环为空,从而使进程永远运行。

有没有比我做得更好的方法?也就是说,在不必使用这种“黑客”的情况下,保持进程运行

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-11-23 21:33:47

最简单、干扰最少的解决方案

老实说,我认为我的方法是最不具侵入性的:

代码语言:javascript
复制
setInterval(() => {}, 1 << 30);

这将设置一个无害的间隔,大约每12天触发一次,实际上什么也不做,只是保持进程运行。

最初,我的解决方案使用Number.POSITIVE_INFINITY作为句点,所以计时器实际上永远不会触发,但最近API更改了这一行为,现在它不接受任何大于2147483647的值(即2 ** 31 - 1__)。请参阅文档和。

对其他解决方案的评论

作为参考,以下是到目前为止给出的另外两个答案:

Joe的(从那时起被删除,但完全有效):

代码语言:javascript
复制
require('net').createServer().listen();

将创建一个他所说的“假监听器”。一个小缺点是,我们会为此分配一个端口。

雅各布的:

代码语言:javascript
复制
process.stdin.resume();

或者是等效的:

代码语言:javascript
复制
process.stdin.on("data", () => {});

stdin置于“旧”模式,这是Node.js中仍然存在的一个不推荐使用的功能,以便与在Node.js v0.10 (reference)之前编写的脚本兼容。

我建议你不要这么做。它不仅被弃用了,而且还不必要地扰乱了标准输入。

票数 39
EN

Stack Overflow用户

发布于 2014-05-13 11:59:43

使用"old" Streams mode监听永远不会出现的标准输入:

代码语言:javascript
复制
// Start reading from stdin so we don't exit.
process.stdin.resume();
票数 36
EN

Stack Overflow用户

发布于 2021-03-15 06:09:57

您可以使用setTimeout(function() {""},1000000000000000000);命令使脚本保持活动状态,而不会超载。

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

https://stackoverflow.com/questions/23622051

复制
相关文章

相似问题

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