問題タブ [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.

0 投票する
2 に答える
3150 参照

node.js - node.js イベント ループの診断

診断のためにイベント ループを覗くことはできますか?

現在実行を待っているイベントの数を知りたいです (setTimeout/interval を除く)。

更新: 実行中のノード プロセス内からこれを実行したいと思います。

0 投票する
1 に答える
894 参照

pyqt - Scrapy/TwistedイベントループをPyQt4メインループに統合する

私はウェブサイトをクロールするためにscrapyを使用しているPyQt4ツールを開発しています。UIからScrapyスパイダーを実行するための新しいプロセス[マルチプロセッシング]を開始します。すべてが正常に機能します〜UIがブロックされ、Scrapyがスクレイピングされます。

TwistedイベントループをPyQtメインループに統合したいのですが、ノンブロッキングUIが必要です。

誰かがこれをできるだけ簡単に達成する方法を知っていますか?Scrapy / PyQt / Multiprocessing/Twistedは初めてです。

私はPyQt4、Python 2.7、Scrapy0.12.0.2546を搭載したXubuntu12.04ボックスを使用しています。

前もって感謝します。

0 投票する
4 に答える
2906 参照

javascript - ブラウザのイベント ループとタスク キューに違いはありますか?

この質問の答えのいくつかの用語について少し混乱しています: JavaScript でのイベントの優先順位は何ですか?

イベント ループとタスク キューに違いはありますか? また、これらのキューはどれくらいの大きさにできますか?

で間隔を設定し、setInterval()これを中断するとalert()、アラートが表示されている間、間隔がドロップされるためです。

0 投票する
1 に答える
421 参照

yield - なぜイベントループで譲歩するのですか?

私は C++ フレームワークを使用しました。このフレームワークでは、すべてのループ サイクルの最後の yield が必須でした。C# と C++/CLI から始めたので、yield 関数にも出くわしました。イベント ループを作成していますが、yield の使用が必要かどうか疑問に思っていました。フレームレートが重要なゲームを作成しているわけではなく、最大のパフォーマンス (速度) を目指しています。

異なるアプリケーション間で実行時間を適切に分割できるプラットフォームではありませんか? そのため、yield を使用する必要がありますか?

はいの場合、どれくらいの時間これを行う必要がありますか?スレッドスリープを使用する方が良いのではないでしょうか?優先度の低いスレッドにも余分な時間がかかりますか?

.NET 以外の言語に関する回答も歓迎します。利回りの一般的な目的が本当に必要かどうか、私はただ興味があります。

ありがとう

0 投票する
4 に答える
14897 参照

node.js - NodeJS イベント ループを実行する / 子プロセスが終了するのを待つ

最初に問題の一般的な説明を試みた後、通常のアプローチが機能しない理由をさらに詳しく説明しました。これらの抽象化された説明を読みたい場合は、続けてください。最後に、より大きな問題と具体的なアプリケーションについて説明しますので、それを読みたい場合は、「実際のアプリケーション」にジャンプしてください。

node.js 子プロセスを使用して、計算集約的な作業を行っています。親プロセスは機能しますが、実行のある時点で、続行する前に子プロセスからの情報を取得する必要があるポイントに到達します。したがって、子プロセスが終了するのを待つ方法を探しています。

私の現在のセットアップは次のようになります。

そしてどこか

したがって、親プロセスが開始されると、コードの最初のビットが実行され、子プロセスが生成されてデータが計算され、独自の作業が続けられます。継続するために子プロセスからの結果が必要になると、 を呼び出しますgetImportantData()。したがって、getImportantData()データが計算されるまでブロックするという考え方です。

しかし、私が使用した方法は機能しません。これは、while ループを使用してイベント ループが実行されないようにしたためだと思います。そして、Event-Loop が実行されないため、子プロセスからのメッセージを受信できず、while-loop の状態が変化せず、無限ループになります。

もちろん、私はこの種の while ループを使いたくありません。私がやりたいことは、node.js に「イベント ループの 1 回の反復を実行してから、戻ってきてください」と伝えることです。必要なデータが受信されるまでこれを繰り返し実行し、ゲッターから戻って実行を続けます。

彼が同じ関数に何度か再入する危険性があることは理解していますが、これを使用したいモジュールは、子プロセスからのこのメッセージを待機し、進行状況を報告する他のメッセージを送信することを除いて、イベントループでほとんど何もしません。それで問題ないはずです。

Node.jsでイベントループを1回だけ実行する方法はありますか? または、同様のことを達成する別の方法はありますか? それとも、私がここでやろうとしていることを達成するためのまったく異なるアプローチがありますか?

これまでのところ、私が考えることができる唯一の解決策は、さらに別のプロセスを導入するように計算を変更することです。このシナリオでは、重要なデータを計算するプロセス、重要なデータが不要なデータのビットを計算するプロセス、およびこれら 2 つの親プロセスがあり、2 つの子プロセスからのデータを待って結合します。彼らが到着したときの作品。それ自体で計算集約的な作業を行う必要がないため、イベント ループ (= メッセージ) からのイベントを待機してそれらに反応し、必要に応じて結合されたデータを転送し、まだ結合できないデータの断片を格納することができます。ただし、これによりさらに別のプロセスが導入され、プロセス間通信がさらに増えるため、オーバーヘッドが増えるため、これは避けたいと思います。

編集

詳細が必要であることがわかります。

親プロセス (プロセス 1 と呼びましょう) は、それ自体が別のプロセス (プロセス 0) によって生成されたプロセスであり、計算集約的な作業を行います。実際には、私が制御できないコードを実行するだけなので、非同期で動作させることはできません。私ができること (そして実行したこと) は、定期的に実行されるコードに関数を呼び出して、進行状況を報告し、部分的な結果を提供することです。この進捗レポートは、IPC を介して元のプロセスに送り返されます。

ただし、まれに部分的な結果が正しくない場合があるため、修正する必要があります。そのためには、通常の計算とは別に計算できるデータが必要です。ただし、この計算には数秒かかる場合があります。したがって、別のプロセス (プロセス 2) を開始してこの計算を行い、IPC メッセージを介してプロセス 1 に結果を提供します。現在、プロセス 1 と 2 は喜んで計算を行っており、プロセス 2 で計算された補正データは、プロセス 1 が必要とする前に終了していることを願っています。しかし、プロセス 1 の初期の結果の 1 つを修正する必要がある場合があり、その場合、プロセス 2 が計算を完了するのを待たなければなりません。プロセス 1 のイベント ループをブロックしても、メイン プロセス (プロセス 0) は影響を受けないため、理論的には問題ありません。唯一の問題は、

そのため、イベント ループをブロックせずに、プロセス 1 のコードの実行を一時停止する必要があります。process.runEventLoopIterationイベントループの反復を実行してから戻るような呼び出しがあることを望んでいました。

次に、次のようにコードを変更します。

したがって、必要なデータを受け取るまでイベントループを実行しますが、getImportantData() を呼び出したコードの実行は継続しません。

基本的に私がプロセス1でやっていることはこれです:

実際の適用・実装・問題点

次のアプリケーションでは、この動作が必要です。これを達成するためのより良いアプローチがある場合は、遠慮なく提案してください。

任意のコードを実行し、変更された変数、呼び出された関数、発生した例外などについて通知を受けたいと考えています。収集した情報を UI の横に表示するには、コード内のこれらのイベントの場所も必要です。オリジナルコード。

これを実現するために、コードを計測し、コールバックを挿入します。次に、コードを実行し、その実行を try-catch ブロックでラップします。コールバックが実行に関する何らかのデータ (変数の変更など) で呼び出されるたびに、変更について知らせるメッセージをメイン プロセスに送信します。このようにして、実行中にコードの実行についてユーザーに通知されます。これらのコールバックによって生成されたイベントの位置情報は、インストルメンテーション中にコールバック呼び出しに追加されるため、問題はありません。

例外が発生すると問題が発生します。また、テストされたコードの例外についてユーザーに通知したいと考えています。そのため、コードの実行を try-catch でラップし、実行から出た例外をキャッチしてユーザー インターフェイスに送信します。しかし、エラーの場所が正しくありません。node.js によって作成された Error オブジェクトには完全なコール スタックがあるため、エラーが発生した場所がわかります。ただし、この場所はインストルメント化されたコードに対して相対的であるため、この場所情報をそのまま使用して、元のコードの横にエラーを表示することはできません。インストルメント化されたコード内のこの場所を元のコード内の場所に変換する必要があります。そのために、コードを計測した後、ソース マップを計算します。インストルメント化されたコード内の場所を元のコード内の場所にマップします。ただし、この計算には数秒かかる場合があります。そこで、インストルメント化されたコードの実行が既に開始されている間に、子プロセスを開始してソース マップを計算することにしました。次に、例外が発生したときに、ソース マップが既に計算されているかどうかを確認し、計算されていない場合は、位置を修正できるように計算が完了するのを待ちます。

実行および監視されるコードは完全に任意である可能性があるため、非同期に簡単に書き直すことはできません。私はそれが提供されたコールバックを呼び出すことだけを知っています. また、メッセージを保存してコードの実行を続行するために戻って、次の呼び出し中にソース マップが終了したかどうかを確認することもできません。これは、コードの実行を続行するとイベント ループもブロックされ、計算されたソースが妨げられるためです。 map は、実行プロセスで受信されることはありません。または、受信した場合は、実行するコードが完全に終了した後でのみ、かなり遅くなるか、まったく終了しない可能性があります (実行するコードに無限ループが含まれている場合)。しかし、sourceMap を受け取る前に、実行状態に関する更新をさらに送信することはできません。組み合わせて、

イベント ループに制御を一時的に明け渡すことで、この問題は解決します。しかし、それは不可能のようです。もう 1 つのアイデアは、実行プロセスと sourceMapGeneration プロセスの両方を制御する 3 番目のプロセスを導入することです。実行プロセスから進捗メッセージを受信し、修正が必要なメッセージがある場合は、sourceMapGeneration プロセスを待ちます。プロセスは独立しているため、制御プロセスは受信したメッセージを保存し、sourceMapGeneration プロセスが実行されるまで待機することができます。その間、実行プロセスは実行を続けます。ソース マップを受信するとすぐに、メッセージを修正してすべてを送信します。

ただし、これにはさらに別のプロセス(オーバーヘッド)が必要になるだけでなく、プロセス間でコードをもう一度転送する必要があることも意味します。コードには何千もの行が含まれている可能性があり、それ自体に時間がかかる可能性があるため、移動したいと思いますできるだけ少なくします。

これで、通常の「非同期コールバック」アプローチを使用できない、または使用しなかった理由が説明されることを願っています。

0 投票する
2 に答える
2064 参照

libevent - CentOS で libev (dev) をコンパイルする

Linux (CentOS) 64 ビットでlibev-devをコンパイルする方法についてどこかに指示があるかどうか疑問に思っていました。libev に関連する開発パッケージも、そのコンパイルに関するチュートリアルも見つけることができませんでした。ps: パッケージ マネージャーは使用しないでください。特権なしでクラウドにインストールするためです。

0 投票する
1 に答える
495 参照

node.js - イベントループにまだイベントが登録されているかどうかを調べる方法 (ボーナス: いくつ)

javascript プログラムを実行および監視する Node.js プログラムを作成しようとしています。監視対象のプログラムがまだ「実行中」かどうか、つまり何か役に立つことを行っているかどうかを調べる方法を探しています。

私の現在のアプローチでは、テストするコードを受け取ると、新しい子プロセスを開始してコードを渡します。子プロセスは、Contextifyを使用してサンドボックスを作成するコードを計測し、このサンドボックスを使用してコードを実行します。

呼び出しが返された後sandbox.run(code)、コードのブロック部分が終了したことがわかり、それを UI に表示できます。ただし、コードが setTimeouts を使用してタイマーを登録したかどうか、またはコードの一部を後で終了させる他のイベント ソースを作成したかどうかはわかりません。だから、本当に「完成」したかどうかはわかりません。

Node.js で、処理するイベント ループにまだイベントがあるかどうかを確認する方法はありますか (さらに良いことに、残っているイベントの数)。

this other questionを見つけましたが、イベントループを監視してノードのパフォーマンスがまだ問題ないかどうかを確認する方法についてのみ説明しています。しかし、私はパフォーマンスには興味がありません (実行中のコードが 10 秒間ブロックされているのか、2 分ごとに 1 ミリ秒だけ何かを実行しているのかは気にしません)。外部ツールを使用したくありませんが、ノード自体の内部からのイベント ループ。それは可能ですか?

0 投票する
1 に答える
1513 参照

c++ - イベント ループを構築する C++11 の方法

C++11 のイベント ループ システムの基本構造は何ですか? 主要な要素 (メッセージ キュー、メッセージ ディスパッチャ、シグナルなど) はどのように実装されていますか? たとえば、 c ++ 98 +ブースト方法で行ったように、a std::queue<Message>、a、std::mutexおよびaがまだ必要ですか? また、私が求めているソリューションではパフォーマンスが重要です。std::condition_variable