このAPIエンドポイントはwww.example.com/endpointと呼ばれ、多くのデバイスがポストしています(私はIOT会社で働いています)。私たちは全体をNodeJSで実装しており、1台のデバイスからn台のデバイスにスケーリングしている間に固まっています。デバイスは、このAPIエンドポイントでパケットを送信します。このAPIエンドポイントから複雑なビットのコード(arnd 1000行)を実行し、デバイスの状態をデータベース(mongoDB)に保存します。今問題はです。私がデバイス1からパケットを受信し、それを実行している途中でデバイス2からパケットを取得すると、NodeJSはデバイス1の実行をそのまま残し、デバイス2からのパケット2のサービスを開始します。広範なconsole.log()ステートメント
今、理想的な世界です。私はノードが現在の進行状況をパケット1で保存しておきたいと思います。後で処理される待ち行列にパケット2を保存する。私がパケット1で終わったら、パケット2を取り出して処理します。
私はRabbitMQとkueのようなライブラリを知っていて、それをキューに格納して後で処理するのですが、ですが、どの実行環境から別の実行にコンテキストを切り替えるのですか?
これは私の考え方です。他の解決方法もあります。問題についてのあなたの考えを聞きたいと思います。NodeJSで同時実行またはコンテキストスイッチを実装する方法
答えて
Q:NodeJSで並行処理またはコンテキスト切り替えを実装する方法。
A:短い答え:不可。 Javascriptはシングルスレッドなので
Q:今、問題がある。私がデバイス1からパケットを受信し、それを実行している途中でデバイス2からパケットを取得すると、NodeJSはデバイス1の実行をそのまま残し、デバイス2からのパケット2のサービスを開始します。広範囲にconsole.log()文
A:すでにI/Oのための非ブロッキングでイベント駆動型モデルに基づいていますNodeJS
多くの場所で読んだことがあるかもしれませんが。 device1
のコードはすでにそれだけでコールバックにasynchronous function
に待っているポイントまでアップ処理されているため、ノードはdevice2
に奉仕するdevice1
途中で捨てているように見える理由
理由でした。例えば。データベース書き込みを実行する。だから、それまでの間、それが利用可能である一方で、それはdevice2
のサービスdevice2
同様のケースへ行ってきました - それはリターンのために保留中、イベントがイベントキューにプッシュされますasync
機能を打つ一度。 Node
は、応答が戻ってきた場合はdevice1
に戻ることがあります。または、他のデバイス、deviceN
かもしれません。
私たちは、node
プロセスが単独の応答でWebアプリケーション全体をロックしないため、NodeJSは非ブロックであると言います。代わりに、次のイベント(本質的にコードブロック)をキューから取り出して実行します。したがって、実際にはイベントキューには何も利用可能でない限り、常にビジー状態です。
Q:私はキューに格納し、後でそれを処理するためのRabbitMQとKUEなどのライブラリを知っているが、どのように私のコンテキストは、別の実行を切り替えるのですか?
A: 前述のとおりです。 2016年の時点では、Javascriptがスレッド化することはまだできません。 NodeJSはであり、計算量が多くなるように設計されたではありません。要求を処理することのみに焦点を合わせる必要があります。したがって、コードは軽く非ブロックであることが望ましいです。基本的には、ファイルやデータベースへの書き込みや、非同期関数で呼び出しをラッピングすることによって他のプロセスにHTTP要求(ネットワーク)を行うといった、大量のI/O処理を残したいと思うでしょう。
NodeJSは銀色の技術ではありません。アプリケーションがイベントスレッドで多くの計算作業を行うことが予想される場合、Node
は恐らくテクノロジーの良い選択ではありませんが、世界の終わりではありません。
を参照してください: https://nodejs.org/api/child_process.html
またNIO
とThreading
能力を持っているJava
のような選択肢を検討する必要があります。
- 1. 同時実行ユニットテストの実行方法?
- 2. JDBC同時実行の実装
- 3. 実行時ライセンスを実装する方法は?
- 4. nodeJsと同時にMysqlクエリを実行
- 5. アンドロイドまたはiosモバイルデバイスでNodejsランタイムを実行する方法
- 6. AMQPlib nodejsコンシューマタスクの同時実行
- 7. 実行時に同じ関数を再実行する方法
- 8. Objective-C:実行時の実装を決定する方法
- 9. 実行時にカスタムコミット間隔を実装する方法
- 10. JPAセッションと同時にGetOrCreateを実装する方法は?
- 11. 同時実行性:受信キューと送信キューの両方でエグゼキュータを実装する方法は?
- 12. これをnodejsで実装する方法は?
- 13. Autofac - 実行時情報を使用するファクトリを実装する方法は?
- 14. nodejsで使用するlibevでev_timerを実装する方法
- 15. カスタムプレゼンター行を実装する方法は?
- 16. NHibernateにおける同時実行の実装
- 17. Dartで実行時の型チェックを実行する方法は?
- 18. 実行時に.NETでスワップメソッドの実装を行いますか?
- 19. 実行時に変更可能な機能を実装する方法は?
- 20. nodejsを同期して実行する
- 21. Nodejs非同期実行
- 22. コンテキストスイッチの実装 - 2番目の関数が再実行されない
- 23. ビジネスロジックの実行に時間がかかる(2000ms)場合、nodeJSは同時リクエストを処理する方法
- 24. nodejsでCPUバインドタスクを実装する方法
- 25. NodeJsでトランザクション・トレーシングを実装するためのダイナミック・スコープの作成方法は?
- 26. Geanyをビルドして同時に実行する方法は?
- 27. タイマーを同時にPythonで実行する方法
- 28. ado.netで同時実行の競合を解決する方法
- 29. IDLEで同時に2つのモジュールを実行する方法
- 30. PreviewMouseLeftButtonDownとドラッグアンドドロップイベントを処理する方法Wpfで同時実行
複雑なコードは何をしていますか?それは純粋に計算的ですか、それともデータベース/ファイル/ネットワークのやりとりのような(たくさんの)I/Oを含んでいますか?ノードは多くの並行I/Oをかなりうまく処理できます。 – robertklep
多くのコールバックが含まれています... –
これは「たくさんのI/O」を意味すると仮定すると、何か他のものがあなたの問題を引き起こしていると思います。 – robertklep