2012-04-12 7 views
4

私はAnyEventを使って非同期で書かれたPerlプロジェクトに取り組んでいます。テスト中に、私のコードのバグにより、テストが完了した後にブロックされたコードが呼び出され、テストが合格したように見える状況が発生しましたが、ブロックされたコールが後に他のテストを汚染してしまいました。は、AnyEventイベントキューを表示する手段です。

テストのティアダウンでは、AnyEventが他のブロックされた呼び出しを待っていないことを確認してください。まだ実行されていない呼び出しがあれば、AnyEventをチェックできますか?

+0

Afaikは、使用しているイベントループの実装によって異なります。 '' AnyEvent :: Loop'''という名前の純粋なperl実装、特に変数 '' '@ timer''と' '@ idle''(ソースを見る)を見てみましょう。 – mzedeler

答えて

-1

あなたの質問には直接答えを持っていませんが、私はそれはまた、あなたを助ける、

  • 使用AnyEventは::あなたは非同期分岐が発生した場所を知っていることを確認するために、ログ助けるかもしれない二つのことを提案したいと思います子> AnyEvent-でそれを見守って、あなたはさらに

に移動する前に、それが終了を確認しながら、
  • は、サブプロセスでテストルーチンを実行して破壊取得されていない、あなたが作成したものを見つけるために

    また、作成された条件付き変数やIOハンドルの制御がどこから失われているかを確認してください。破壊するために利用できる方が良い場合は、テストがはるかに簡単になります。

  • 0

    AnyEvent::Debugを使用してウォッチャーをラップし、wlを含むすべてのウォッチャーを一覧表示するコマンドをソケットで待機すると、必要なものが得られます。

    AnyEvent :: Debug :: shell :: wl関数を呼び出してウォッチャーリストを取得し、AnyEvent :: Debug :: Wrappedメソッドを反復して検査することができます。

    2

    私が答えた後に質問が変更されたため、最初の回答が削除されました。これはむしろイライラしているので、回答を得たい場合は、本当にこのような質問を変更すべきではなく、それらを修正する必要がありますので、文脈は明確です。

    新しい質問については、AnyEvent自体にはイベントキューがないため、表示できません。基になるイベントライブラリの中には、イベントキューを持つものもあれば、イベントキューを公開するものもありません。

    イベントがキューに入っていない可能性があります(イベントが処理されている間にタイマーが経過する可能性があるなど、イベントがキューにまだ入っていない可能性もあります)。イベントキューでは、それはまだ多かれ少なかれすぐにトリガする)。

    最後にAnyEvent(イベントベース)は、ブロックされた呼び出しを待つことはありません。

    +0

    質問の元の質問者として、私はそれを自分で変更しませんでした。 – tbischel

    関連する問題