2014-05-13 48 views
21

TL; DR

什麼是強制保持Node.js進程運行的最佳方式,即保持其事件循環不會空着,從而避免進程終止?我可以拿出最好的解決辦法是這樣的:如何強制保持Node.js進程終止?

setInterval(() => {}, Number.POSITIVE_INFINITY);

有沒有更好的辦法做到這一點?

問題

的長版我有使用Edge.js註冊一個回調函數,以便它可以在.NET中的DLL中被稱爲Node.js的腳本。這個功能將被稱爲每秒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 { }; 
    } 
} 

唯一的解決辦法我能想出用一個較長的時間來註冊一個計時器調用一個空函數只是爲了保持調度器繁忙,並避免讓事件循環爲空,以便該過程保持永久運行。

有什麼辦法比我做得更好嗎?也就是說,保持進程運行而不需要必須使用這種「黑客」?

+1

您可以在節點端的套接字上啓動一個假偵聽器,以使您的進程保持活動狀態。 – Joe

+0

JXcore(node.js distro)有process.keepAlive和process.release。您可以在其他任何事情之前調用process.keepAlive(),並在應用程序需要關閉時最後調用process.release()。 –

+0

謝謝,@NurayAltin。我現在不打算遷移到JXCore,但很高興知道它有一個API來執行此操作。 –

回答

1

雖然它看起來像有沒有權利回答這個問題,到目前爲止,我們有3名可能的黑客和老實說,我認爲我的做法是侵入性較弱的一個:

setInterval(() => {}, Number.POSITIVE_INFINITY); 

這將設置一個永遠不會觸發的時間間隔。有趣的是,setTimeout()工作不一樣,如果給定Number.POSITIVE_INFINITY作爲其超時參數,將根本不安排。

供參考,在這裏是到目前爲止考慮到其他兩個答案:

喬:

require('net').createServer().listen(); 

將創建一個「虛假的聽衆」,他的說法。一個小缺點是我們會爲此分配一個端口。

雅各布:

process.stdin.resume(); 

或等值:

process.stdin.on("data",() => {}); 

提出stdin變成「舊」模式下,不建議使用的功能,仍然存在於Node.js的與之前編寫的腳本兼容性Node.js v0.10(reference)。雖然它確實有效,但如果您需要使用來自stdin的數據,可能並不理想。

18

使用"old" Streams mode監聽標準的輸入,將永遠不會來了:

// Start reading from stdin so we don't exit. 
process.stdin.resume(); 
+0

謝謝,我會嘗試。你的回答和喬的評論都提供了一個黑客,就像我提出的一個:)似乎沒有「正確」的方式來做到這一點。 –