問題タブ [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.
perl - コールバックからイベントループを呼び出す方法は?
つまり、イベント ループが現在キューにあるイベントを処理するようにします。VBA では、呼び出しの名前はDoEvents
です。
これをPerlでやりたい。できれば AnyEvent でこれを行うことをお勧めします。スクリプトを使用して記述したためです。しかし、ドキュメントにはそのような機能は見つかりませんでした。
ドキュメントにはイベントループを呼び出すと書かれているため、単純にcondvarで実装しようとしましたrecv
が、失敗しました。サンプルコードは次のとおりです。
出力は次のとおりです。
更新: AnyEvent.pm に次の行があります。
それらにコメントすると、DoEvents() が機能します。
ただし、この CPAN モジュールの変更を伴わない解決策を用意した方がよいでしょう。
perl - クラス サブルーチンをコールバックとして渡す
コールバックを受け取るモジュール (AnyEvent::Socket) を使用しています。クラスサブルーチンをコールバックとして渡そうとしていますが、何も機能していません:
未定義の変数について不平を言うだけです。関数を匿名サブルーチンとして渡すと、機能します
perl - perl AnyEvent を使用してかかった個々の時間を測定する
多くの http URL をフェッチする必要があり、AnyEvent::HTTP を使用してこれを行います すべての URL について、所要時間を測定する必要があります。これを行うにはどうすればよいですか?
私のコード(取り除かれたもの)はここにあります
perl - AnyEvent に EV を強制的に使用させる方法
しばらくの間 AnyEvent を使用しており、EV がコンピューターにインストールされています。
EV がインストールされている場合、AnyEvent はそれを最初の手段として使用しようとすることを理解していますが、これを行っている人を見続けています。
perl - PerlのAnyEvent::RabbitMQを使用してRabbitMQから適切に切断するには?
適切な方法でRabbitMQから切断したい。Perl のAnyEvent ::RabbitMQ (私が使用しています)のソース コードを確認したところ、 RabbitMQ に開かれているすべてのチャネルを閉じているように見えるメソッドを見つけました。close
だから私は
- RabbitMQ に接続
- チャンネルを開設しました
- 交換を宣言した
- その交換に縛られた
- キューを宣言しました
- そのキューにバインドされた
close
インスタンスでメソッドを実行しAnyEvent::RabbitMQ
ます (インスタンスではありません::Channel
)
接続は閉じているように見えますが、RabbitMQ ログには、「AMQP 接続」が「connection_closed_abruptly」であったことが示されています。
その接続の完全な RabbitMQ ログは次のとおりです。
サンプルコードは次のとおりです。
Perl を使用して RabbitMQ から適切に切断するにはAnyEvent::RabbitMQ
?
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()
、イベントシステムはスレッドセーフではありません。
perl - Perl Anyevent 、ノンブロッキング redis プッシュ
redis サーバーへの非ブロッキング rpush を実行するコードを以下に示します。これを 1 つの rpush だけで実行すると、コードは正常に動作しますが、これを while ループで実行すると、最初の実行後にスクリプトがハングします。なんで ?