問題タブ [anyevent]

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 投票する
1 に答える
593 参照

perl - コールバックからイベントループを呼び出す方法は?

つまり、イベント ループが現在キューにあるイベントを処理するようにします。VBA では、呼び出しの名前はDoEventsです。

これをPerlでやりたい。できれば AnyEvent でこれを行うことをお勧めします。スクリプトを使用して記述したためです。しかし、ドキュメントにはそのような機能は見つかりませんでした。

ドキュメントにはイベントループを呼び出すと書かれているため、単純にcondvarで実装しようとしましたrecvが、失敗しました。サンプルコードは次のとおりです。

出力は次のとおりです。

更新: AnyEvent.pm に次の行があります。

それらにコメントすると、DoEvents() が機能します。

ただし、この CPAN モジュールの変更を伴わない解決策を用意した方がよいでしょう。

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

perl - クラス サブルーチンをコールバックとして渡す

コールバックを受け取るモジュール (AnyEvent::Socket) を使用しています。クラスサブルーチンをコールバックとして渡そうとしていますが、何も機能していません:

未定義の変数について不平を言うだけです。関数を匿名サブルーチンとして渡すと、機能します

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

perl - perl AnyEvent を使用してかかった個々の時間を測定する

多くの http URL をフェッチする必要があり、AnyEvent::HTTP を使用してこれを行います すべての URL について、所要時間を測定する必要があります。これを行うにはどうすればよいですか?

私のコード(取り除かれたもの)はここにあります

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

perl - AnyEvent に EV を強制的に使用させる方法

しばらくの間 AnyEvent を使用しており、EV がコンピューターにインストールされています。

EV がインストールされている場合、AnyEvent はそれを最初の手段として使用しようとすることを理解していますが、これを行っている人を見続けています。

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

perl - PerlのAnyEvent::RabbitMQを使用してRabbitMQから適切に切断するには?

適切な方法でRabbitMQから切断したい。Perl のAnyEvent ::RabbitMQ (私が使用しています)のソース コードを確認したところ、 RabbitMQ に開かれているすべてのチャネルを閉じているように見えるメソッドを見つけました。close

だから私は

  1. RabbitMQ に接続
  2. チャンネルを開設しました
  3. 交換を宣言した
  4. その交換に縛られた
  5. キューを宣言しました
  6. そのキューにバインドされた
  7. closeインスタンスでメソッドを実行しAnyEvent::RabbitMQます (インスタンスではありません::Channel)

接続は閉じているように見えますが、RabbitMQ ログには、「AMQP 接続」が「connection_closed_abruptly」であったことが示されています。

その接続の完全な RabbitMQ ログは次のとおりです。

サンプルコードは次のとおりです。

Perl を使用して RabbitMQ から適切に切断するにはAnyEvent::RabbitMQ?

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

multithreading - AnyEvent、RabbitMQ (ハートビート)、および Perl で実行時間の長いジョブを処理する方法は?

分散 cronjob 実行用のシステム (いわゆるcron コンピューティング クラスター) を実装しています。アクションの時間になったら、Cronjobs をメッセージ キュー (RabbitMQ) に入れる必要があります。反対側 (クラスターのノード/ワーカー) はAnyEvent::RabbitMQ、メッセージ キューから正確に 1 つの cronjob/タスク/メッセージを受信し、タスクを処理し、メッセージ キューから正確に 1 つの cronjob/タスク/メッセージを要求するために利用する Perl デーモンです。すぐ。

AnyEvent::RabbitMQ私は、RabbitMQが壊れた接続を識別するのを助けるために実装されている RabbitMQ のハートビート機能を使用しています。

ハートビート間隔の実際の値は気にしないでください! また、数日かかる非常に長時間実行されるジョブもあります。したがって、間隔を cronjob にかかる最長の時間に設定することはオプションではありません。

Perl デーモン ワーカー内で実際の cronjob を実行するには、次のスニペットを参照してください。メッセージに対してRabbitMQをDoSしないように、「AnyEvent->timer」内に実装されています。このメソッドは、RabbitMQconsumeが (管理によって) 禁止されていたため使用されました。

progress_job()メッセージが解析され、ジョブが実行される場所です。pause_timer()をトリガーし、 をresume_timer()制御します。AnyEvent->timer_timer_tick()

最初の長時間実行ジョブが開始され、システムが「クラッシュ」してさまざまなエラー メッセージが表示されました。'Unknown channel id: 1' をスローすることもあれば、'Channel has already been closed' をスローすることもあります。そこで、「ダム デバッグ」(構成をいじろうとする) を実行したところ、間隔がこれらのエラーheartbeat内の所要時間よりも短い場合にスローされることがわかりました。progress_job()少し考えた後、それは理にかなっています。progress_job()はブロッキング サブルーチンであり、AnyEvent はハートビート パッケージを RabbitMQ に送信できません。

progress_job()ブロッキング ヒートビートの問題を解決するために最初に考えたのは、子プロセスでfork して doすることでした。FORK に関する AnyEvents のドキュメントでforkは、子内で (AnyEvent などを介して) イベント システムにアクセスできない場合に使用するために保存されていることが指摘されています。次の考え: OK、イベント システムにアクセスできないので、fork を実行できます。resume_timer()BUT: タイマーは ( )progress_job()が戻った後に再開する必要があります。理論的には、リターンの後ではなく、resume_timer()直後に呼び出されます。だから私は私の実装を停止しました。fork()progress_job()

私の質問: 最後のビットを解決するにはどうすればよいですか? (つまり、フォークされた子) が戻ったresume_timer()後はどうすればよいですか? progress_job()分岐が原因で子に入れることができずresume_timer()、イベントシステムはスレッドセーフではありません。

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

perl - Perl Anyevent 、ノンブロッキング redis プッシュ

redis サーバーへの非ブロッキング rpush を実行するコードを以下に示します。これを 1 つの rpush だけで実行すると、コードは正常に動作しますが、これを while ループで実行すると、最初の実行後にスクリプトがハングします。なんで ?