2011-05-07 73 views
7

我想爲此進程添加一個小時的超時時間,以便在流死鎖的情況下它不會永久保留。唯一的問題是如果我說setTimeout,流程沒有機會提前結束。Node.JS:setTimeout不會保持進程運行

有沒有辦法在大約一個小時後進入強制退出超時而不保持進程運行?或者我堅持使用process.exit和沒有這種超時做?

回答

12

unref加入節點,但現在這是一個可能的解決方案我不知道。重用馬特的代碼:

var timeoutId = setTimeout(callback, 3600000); 
timeoutId.unref(); // Now, Node won't wait for this timeout to complete if it needs to exit earlier. 

的醫生說:

在setTimeout的情況下,當你UNREF您創建一個單獨的計時器,將喚醒事件循環,創造了太多的這些可能產生不利影響的事件循環表現 - 明智地使用。

不要去野豬。

+1

不錯,我沒有聽說過這個。 [節點0.9.1中增加了'unref'](https://github.com/joyent/node/releases/tag/v0.9.1) – 2013-12-30 15:21:31

5

如果您節省setTimeout返回的值可以隨時取消其與clearTimeout閃光之前,像這樣:

var timeoutId = setTimeout(callback, 3600000); // 1 hour 

// later, before an hour has passed 
clearTimeout(timeoutId); 
+0

我希望有一些不需要'clearTimeout'的東西。我會不做。 – 2011-08-10 17:33:34

1

使用 new featurewas implemented作爲process.watchers(),但我不知道是否也可能的解決方案它被包含在發佈的版本中。在此帖子中,pull request仍然是開放的。

但是一般來說,您會編寫一個自定義的setTimeout函數,將所有超時添加到計數器,並且在超時回調之前,它將從計數器中刪除。

然後創建一個持續的時間間隔,並且間隔時間會檢查並注意所有步行者是否只是您的自定義函數設置的超時。

當它注意到它時,它會清除它的所有超時,導致一個)退出。

這當然也不是很大,因爲

  • 概念沒有得到證實。 (我不知道process.watchers()會返回什麼樣的數據,或者它是否還能正常工作)
  • 間隔是輪詢方法。 (不是很好,如果你想在同一時間立即返回低CPU使用率)