問題タブ [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 - Net::RabbitMQ が機能しない例
私が取り組んでいるプロジェクトのためにRabbitMQを学ぼうとしています。私の調査では、Net::RabbitMQ と AnyEvent::RabbitMQ の 2 つのライブラリを使用することがわかりました。AnyEvent::RabbitMQ は私のニーズに対して過度にバロックに見えますが、例が示すように Net::RabbitMQ は機能していないようです。以下は私が見つけたサンプルコードです。POD で見たものと一致しますが、機能していません。
エラーが発生します:
perl - AnyEvent::Fork 子を待つ方法
モジュールを見ていAnyEvent::Fork
ます。並行して (一度に 6 つ) 呼び出したい 20 個の外部スクリプトがあり、すべてが終了したら後でそれらの出力を要約します。これを達成する方法がわかりません。
モジュール内のサンプル コード (1 つの子のみを呼び出す) には問題があります。コードに単純なスリープを追加してすぐに戻らないようにするだけで、親は子プロセスを待たずにすぐに終了します。
その結果、それ/tmp/log
は空です。ここでの使用方法condvar
がわかりません。ドキュメントにはありません。を使用して実行中の子の数を取得できますcondvar
か?
これを正しく行う方法を教えてください。
UPDATEここでの主な問題は、親が子が完了するのを待たないことです。
perl - プログラムの実行時にインストールされたモジュールが見つかりません
環境
これは、特定のイベント ループを使用する方法を確認したかった perl テスト スクリプトですAnyEvent
。
問題
上記のコードを実行したときに表示されるエラーは次のとおりです。
それでも、AnyEvent
を使用してパッケージをインストールしましたがcpanm
、AnyEvent/Impl/EV.pm
ファイルは次の@INC
パスのいずれかに存在します。
質問
これを修正するにはどうすればよいですか?
追記
エラー メッセージには を探していると表示されていますEV.pm
が、期待していたはずAnyEvent/Impl/EV.pm
です。
私が書いたものが実行時use AnyEvent::Impl::EV;
に変わったのはなぜですか?perl is looking for EV.pm
perl - スクリプト全体を一時停止せずに、AnyEvent コールバックでどのように「スリープ」しますか?
私は特に AnyEvent::Inotify::Simple (バックエンドとして EV を使用) を使用してファイル イベントを監視しています。したがって、特定のケースでは、続行する前に「一時停止」する必要があるハンドラー コールバックがあります。 sleep
明らかにすべてを停止します(そのため、他のイベントは処理が完了するまで処理されませんsleep
)ので、使用してみalarm
ましたが、アラームを再度設定する同じシナリオが発生した場合、元のアラーム(したがってその$SIG{ALRM}
サブ)は無視され、「新しい" 1 つが実行されます。
アドバイスをいただければ幸いです。必要なのは、新しい inotify イベントを非同期で処理し続けながら、コールバックを一時停止する方法だけです。
perl - AnyEvent::Handle と tcp_connect を使用して再接続します
AnyEvent::Handle
と を活用tcp_connect
して記述した単純な TCP サーバーとクライアントがありますtcp_server
。クライアントはサーバーに接続し、Test Message
5 秒ごとに文字列を送信します。
これは、サーバーに到達できる場合は問題なく機能しますが、クライアントの起動時にサーバーが利用できない場合、または利用できなくなった場合、クライアント スクリプトは再接続を試みません。
接続ハンドルが利用できない場合 (破棄された場合) は、再接続を試みてください。利用できない場合は、何かを行います (おそらくステータス メッセージを出力します) が、理想的な結果は 5 秒ごとに再接続することです。
どうすればいいのかわかりません。クライアントとサーバーのコードを次のように簡素化しました。
クライアント
サーバ
perl - AnyEvent ファイルの書き込みと logrotate により、予期しないファイル サイズが発生する
AnyEvent を使用して頻繁にファイルに書き出すスクリプトがあります。私が直面している問題を説明するために、次のサンプルを作成しました。
これはうまく機能しますが、しばらくするとファイル サイズが膨大になります。このような問題には logrotate を使用するため、次の logrotate 構成ファイルを作成しました。
これもうまく機能し、上記の出力ファイルが 2M を超えるたびに、out_test.log.1 にローテーションされます。ただし、ローテーション直後に out_test.log を書き込むと、ファイルサイズはローテーションしたログファイルと同じになります。この動作と私が経験していることは、https ://serverfault.com/a/221343 で説明されています。
問題は理解できましたが、提供したサンプル Perl コードの問題を修正する方法がわかりません。
logrotate を使用してログ ローテーションを実装する必要はありませんが、実装することをお勧めします。スクリプトに実装するのが簡単であればそれもできますが、上記のサンプルを logrotate でうまく動作させることができればいいと思います。ヘルプやコメントをいただければ幸いです。ありがとう!
編集
以下の回答に基づいて、提供されたmonkeypatch ikegamiで物事を機能させることができ、Marc Lehmannのアドバイスに従ってネイティブperl I / Oを活用することができました。私のコード例は次のようになり、うまく機能します。さらに、これにより、logrotate の copytruncate ディレクティブの要件が削除されます。
perl - AnyEvent::XMPP が XML ストリームの名前空間プレフィックスを使用してサーバーに接続できるようにするにはどうすればよいですか?
接続しようとしている XMPP サーバーには、次のような名前空間プレフィックスがあります(zdef-#########) :
そして、次の「予期されるバインドとセッション」エラーが発生します。
この例を多かれ少なかれ使用して、ホストに接続しています。これらの名前空間プレフィックスを使用しない別のホストに正常に接続できます。
AnyEvent::XMPP を使用して、スクリプトで XML ストリームを正しく処理するにはどうすればよいですか?
いくつかのバージョン情報:
- Perl バージョン: v5.10.1
- AnyEvent::XMPP バージョン: 0.53
perl - AnyEvent::RabbitMQ の閉じたチャネルの問題
メッセージをメッセージ キュー ( RabbitMQ ) にパブリッシュするためのマスター プログラムを作成しています。このプログラムは Perl 5 で書かれており、RabbitMQとの通信にAnyEvent::RabbitMQを使用しています。
次の最小限の例 (私が遭遇した問題) は、同じチャネルを介して送信される 2 番目のコマンドで「チャネルが閉じられました」というエラーで失敗します。
このプログラムは次のことを行う必要があります。
- RabbitMQ に接続する
- RabbitMQ チャネルを開きます
- シンプルなキュー ("test" という名前) を宣言します。
- そのキューにバインドします (「test」という名前)
- メッセージを発行する (「Hello, world!」)
- メッセージの公開に成功したら、少し待ってから別のメッセージを公開します
このプログラム (マスター プログラム) はメッセージを消費しません。この仕事をする他のプログラムがあります。
最小限の例 (上記を参照) では、次の出力が生成されます。
またはRabbitMQ自体がチャネルを閉じるのはなぜですかAnyEvent::RabbitMQ
(接続ではなく、何かを見逃したのですか)?