2017-04-06 26 views
0

我簡化它以更好地理解我需要什麼:我必須做的任務是,我們有一個很長的未知nodejs進程(有很多排隊的異步函數,我們永遠不知道什麼時候他們完成了或類似的東西),我們希望有一個更新過程,我們將當前進程狀態存儲在數據庫中。爲此,我們有一個啓動(它存儲「開始」)和一個在process.on('beforeExit', function() { ... });之上的結束進程。現在我們必須處理客戶要求的「仍在運行」流程。爲此,我們希望每十分鐘更新狀態以使用時間戳運行(此功能已存在並被稱爲state.setRunningState()NodeJs setInterval沒有延長進程的生命週期

現在我遇到了問題,我該如何每10分鐘觸發一次該功能。在工作過程的每一個事件上觸發這個函數,並比較它是否比10分鐘前更老。問題是:有些時候沒有任何事件的時間多了,所以第二個選項是setInterval(),這裏是我的問題:如果我使用setInterval,我的nodejs進程將永遠不會結束,因此進程將無限運行直到間隔被清除。但是我也永遠不知道什麼時候應該調用clearInterval()

所以問題是:一種創建這種超時而不延長nodejs進程生命週期的方法。如果一切完成,它應該結束並忽略間隔的其餘部分。

+0

僅供參考,您可以通過退出過程'的過程。退出()' –

+0

我知道,但這裏沒有答案,因爲仍然是:我不知道,當主進程結束時。它完全是異步的,只有事件驅動。 Btw:process.exit()也跳過事件process.on(「beforeExit」) –

+0

我已經讀過這個問題3次,我仍然不明白你在問什麼......「有沒有辦法創建這種超時而不延長nodejs進程的使用壽命「< - 那麼,你不需要間隔?你有沒有看過'setTimeOut'呢? 「但我也永遠不知道什麼時候應該調用clearInterval()」< - 所以它是基於事件的,但是沒有事件可以幫助您知道何時清除間隔?你希望其他人知道嗎? – Josep

回答

2

與此處的一些註釋相反,這並不是一個奇怪的要求,即在進程運行時定期執行某些內容,而不會使進程無限運行,這將使其毫無意義。

有一個內置的機制。如果您不希望間隔(或超時)停止退出進程,則需要使用.unref()方法。

相反的:

setInterval(() => { 
    console.log('Interval'); 
}, 1000); 

使用:

setInterval(() => { 
    console.log('Interval'); 
}, 1000).unref(); 

,如果有掛起沒有其他活動的時間間隔不會停止從退出進程。

嘗試運行這個例子:

setInterval(() => { 
    console.log('Interval'); 
}, 1000).unref(); 

setTimeout(() => { 
    console.log('Timeout 1'); 
}, 3000); 

setTimeout(() => { 
    console.log('Timeout 2'); 
}, 5000); 

請參閱該文檔:

0

讓我看看,如果我得到這個直。 1-您希望每x分鐘觸發一個事件,除非現有過程已經結束? 2-只要有一個運行的設置間隔,就表示該節點不會退出該進程。 3-你說,因爲你的進程運行「很多排隊的異步函數」,你不知道什麼時候該進程應該結束

我認爲最簡單的解決方案是設置另一個間隔以更高的頻率運行並清除所有函數都返回的時間間隔。否則,你可能有興趣閱讀webworkers

https://www.npmjs.com/package/webworker-threads

+0

.unref()將是更好的選擇,因爲接受的答案建議 –