2017-04-06 1 views
0

私が必要とするものをよりよく理解するために単純化しました。私がしなければならないことは、未知のnodejsプロセスがあることです。それらが完了したかどうかなど)、現在のプロセス状態をデータベースに保存する更新プロセスが必要です。そのためにはスタートアップ(「スタート」を格納)と終了プロセスがprocess.on('beforeExit', function() { ... });の上にあります。今私たちは顧客から要求されている「実行中の」プロセスを処理しなければなりません。そのために、10分ごとに状態をタイムスタンプで実行するように更新する必要があります(この機能は既に存在し、state.setRunningState()プロセスライフタイムを延長しないNodeJs setInterval

と呼ばれています)問題は:いくつかの時間は何もイベントなしではるかに時間があるので、2番目のオプションはsetInterval()であり、私の質問についてはここにあります:私がsetIntervalを使用するとnodejsプロセスが終了しないので、Intervalがクリアされるまでプロセスは無限に実行されます。clearInterval()

質問は次のとおりです。 nodejsプロセスの寿命を延ばすことなく、このようなタイムアウトを作成する方法。すべてが完了したら、残りの期間は無視して無視してください。

+0

について読んで興味があるかもしれません。exit() ' –

+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 - あなたのプロセスは "多くの待機中の非同期関数"を実行しているので、プロセスを終了する必要があるかどうかを知ることはできません。

もっと簡単な解決策は、すべての関数が返された場合の間隔そうしないと、FYIあなたがプロセス `でプロセスを終了することができwebworkers

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

+0

受け入れられた答えが示唆しているように.unref()が良いオプションになります –

関連する問題