問題タブ [event-loop]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
timer - Dart: 作業をイベント ループに延期するサポートされている方法として、期間ゼロのタイマーを使用しています。
実験の結果、継続時間が 0 のタイマーを作成すると、作業をイベント キューに延期できることがわかりました。この機能は、多くの厄介な再入可能性の問題を回避できるため、非常に気に入っています。これは変更されない意図的な機能ですか? ドキュメントに追加できますか?そうでない場合、これを行うためのサポートされている方法はありますか?
node.js - イベントの発行をイベント ループの次のティックまで遅らせる必要を回避するにはどうすればよいですか?
グローバル イベント エミッターを使用して Node.js アプリケーションを作成しています。つまり、私のアプリケーションは完全にイベントを中心に構築されています。この種のアーキテクチャは、ここで説明する 1 つの副次的なケースを除いて、私にとって非常にうまく機能していると思います。
この質問に答えるのに Node.js の知識は必要ないと思います。したがって、私はそれを抽象化しようとします。
次の状況を想像してください。
- グローバル イベント エミッタ ( と呼ばれる
mediator
) を使用すると、個々のモジュールがアプリケーション全体のイベントをリッスンできます。 - 着信要求を受け入れる HTTP サーバーが作成されます。
- 着信リクエストごとに、このリクエストに固有のイベントを処理するイベント エミッターが作成されます。
着信リクエストの例 (純粋にこの質問を説明するため):
ここまでは順調ですね。要求された URL を識別し、適切なイベントを発行することで、このアプリケーションを拡張できます。
これに続いて、ルート要求を処理するモジュールを作成できます。
いいですね。実際には、コードが壊れている可能性があります。その理由は、行emitter.emit('root')
が行の前に実行される可能性があるためですemitter.once('root', ...)
。その結果、リスナーが実行されることはありません。
root
イベントの発行をイベント ループの最後まで遅らせることで、この特定の状況に対処できます。
これが機能する理由は、現在のイベント ループが終了するまでエミッションが遅延され、すべてのリスナーが登録されるためです。
ただし、このアプローチには多くの問題があります。
- このようなイベント ベースのアーキテクチャの利点の 1 つは、発行モジュールが、誰がイベントをリッスンしているかを知る必要がないことです。したがって、イベントの発行を遅らせる必要があるかどうかを判断する必要はありません。なぜなら、何がイベントをリッスンするのか、それを遅らせる必要があるかどうかがわからないからです。
- コードが大幅に乱雑になり、複雑になります (2 つの例を比較してください)。
- おそらくパフォーマンスが低下します
結果として、私の質問は次のとおりです。説明した状況のように、イベントの発行をイベントループの次のティックに遅らせる必要をどのように回避しますか?
2013 年 1 月 19 日更新
この動作が役立つ理由を示す例: http 要求を並行して処理できるようにするため。
各イベントjson.parsed
が元のリクエストを発行する場合、各イベントは別のリクエストに関連しており、特定のリクエストに対して並行して実行されるアクションの組み合わせをリッスンできないため、上記は不可能です。
c - ANSIC互換のイベントループ
libevやlibeventのようなANSI-C互換のイベントループはありますか?私の要件は、-ansiフラグを使用してコンパイルすることです。
ありがとうございました。
python - TideSDK と Python での長い処理ループ
TideSDK で GUI をフリーズせずに Python で長い処理ループを実行する方法はありますか? または、スレッドを使用する必要があります...
ありがとう。
events - Goでイベントをリッスンする慣用的な方法は何ですか?
数か月前、私はRPC ライブラリのために、Go でクローズ可能なイベント ループを実装する方法を考えていました。次のようにサーバーを簡単に閉じることができました。
この実装で私が見つけた問題は、タイムアウトが含まれていることです。つまり、最小クローズ時間が実際よりも 2 秒長くなります。イベントループを作成するより慣用的な方法はありますか?
javascript - Node.JS : forEach と for ループの非同期性
上記の関数では、for ループで実行すると予想される性質は、50 50 回のロギングです。しかし、forEach を使用すると、1 2 3 のログが記録されます ....
これらの実装はどちらも同じように見えますが、実際には異なるタスクを実行します最初の関数は、パラメータとして 0 から 50 までのすべての非同期関数を呼び出しますが、コールバックが完了するのを実際には待ちません
しかし、2 つ目 (私のプロジェクトの 1 つ) は、コールバックを待って、配列内の次の項目に進むようです?
両方とも同じですか?
node.js - Node.js の非同期性を維持する際の問題
そのため、今日、非同期データベース呼び出しをカスタム関数に配置する必要がある状況に遭遇しました。例えば:
次に、プログラムの別のポイントから呼び出します。まず、念のため言っておきますが、これはまだ非同期ですか? (質問の続きという前提で操作します)。ここからやりたいことは、非同期 DB 呼び出しの完了時に別の特定の関数を呼び出すことです。DB 呼び出しが完了時にコールバック関数をトリガーすることはわかっていますが、問題は、このカスタム関数が非常に汎用的であることです (つまり、コード内のさまざまなポイントから呼び出されることを意味します)。そのため、特定のメソッド呼び出しをコールバックに入れることができません。すべての状況に適合するわけではないため、機能します。私が言っていることが明確でない場合は、私がやりたいことの例を以下に示します。
上記の状況を機能させるにはどうすればよいですか?
ありがとう。
java - Javaイベントループ、「穏やかに」スリープ
Javaで複数の非ブロッキングソケットを処理するために、ある種のイベントループを実行しています。問題は、ループをそのままにしておくと、コア全体が使用されることです。(たとえば、クアッドコアがあり、プログラムを起動するたびに、CPUは毎回25%にジャンプします。)
Thread.sleep()を使用してプロセッサの使用を遅くすることができることは知っていますが、それを行う適切な方法があるかどうか疑問に思っていました。Thread.sleep(1)がイベントループを制限しているように感じます。
だから私の質問は、どうすればいいですか?それを行う適切な方法はありますか?スレッドの優先度を下げる必要がありますか?Thread.sleep(0、someNanosecondsAmount)を使用する必要がありますか?
c++ - .netフォームのメインループ、またはフレームごとにトリガーされるイベントにアクセスします
独自のイベントループを作成できるAPIを使用してアプリを作成しました。このアプリケーションを変換するために、.NETフォームで同じ効果を得ようとしています。基本的には次のようになりました。
フォームのメインループにアクセスすることは可能ですか?
または、フレームごとにトリガーされるイベントはありますか?これにより、たとえば、1秒あたりのフレーム数を計算できます。このイベントは、フォームから呼び出す必要はありませんが、システムから呼び出すこともできるため、サービス、アプリケーション、およびWebで使用することもできます。
ありがとう