2017-11-17 24 views
0

ライブラリ(ddp-client)を編集して、X秒ごとにpingを送信するハートビートタイマーを使用しました。しかし、私はブルートゥースハードウェアでいくつかの仕事をしています。ブルートゥースは一時的にイベントループをブロックしていると思われるため、時々戻ってこないpingを担当していると思います。イベントループの特定の機能に優先順位を付ける方法があるので、他のものの前に常に実行されるでしょうか?サーバーからの応答メッセージがいつ到着するのか正確にはわからないので、setImmediateはここでは適切ではないと思います。nodejs関数実行の優先順位付け

次のようにタイマーの実装は、おおよそ次のとおりです。

every X seconds 
if(ping outstanding) { 
    //Did not resolve in time 
    closeConnection() 
} else { 
    ping outstanding = true 
    sendPing() 
} 

私はBluetoothモジュールなしでそれを実行する場合、これは完全に正常に動作します。 Bluetoothモジュールを有効にすると、pingが解決されないことがあります。これは、Bluetoothのスキャンに要する時間がタイマーの間隔よりも長くなることがあり、実際には接続されている間に切断されるためです。

答えて

0

イベントループの特定の機能に優先順位を付ける方法はありますか?それで、常に他のものの前に実行されますか?

node.jsには、あるコードが別のコードを先取りして優先権を持つ方法はありません。 CPUを少しぶつけたり、そうでなければイベントループをブロックするコードは、それをしないように修正するか、それ自身の子プロセスに移すことができ、多くのプロセス間通信のいずれかを介して通信することができますスキーム。

また、pingタイマーが実際に時間通りに実行することが本当に重要な場合は、スケジュールされたとおりに実行できる独自の子プロセスに配置する必要があります。

このような正確なタイマーを実装することは、node.jsがうまくいかないことの1つです。すべてのJavascriptを1つのスレッドで実行するため、サーバーを即座に応答し続けるか、またはタイマーを正確に実行し続ける必要があります。これは、イベントループをブロックしたり、通常の回避策は、CPUで優先順位を決める独自の子プロセスに物事を移行することです。

+0

@robvandijk - これはあなたの質問に答えましたか?もしそうなら、答えの隣にあるチェックマークをクリックしてコミュニティーに示すことができます。また、ここでstackoverflowの正しい手順に従うための評判を得ることができます。 – jfriend00

関連する問題