-1

クライアント接続ごとに「AnyEventタイマー」ウォッチャーオブジェクトを作成するサーバーがあります(AnyEventループに追加します)。

use AnyEvent;

...

my $db_handle = myschema->connect();

my $w; $w = AnyEvent->timer (
       interval => $interval,
       after    => $interval,
       cb => sub {
          ## Remove from loop on some condition
          unless ( $ret = _check_session($sid) ) {
             undef $w;
          }

          ## Execute main logic
          $db_handle->lookup($sid);
       }
);

...

したがって、コールバックは $interval 秒ごとに実行されます。多くのクライアントがある場合、いくつかのコールバックを同時に実行する必要があります。AnyEvent はこれをどのように処理しますか? それらのコールバックを次々に実行しますか、またはこの場合、これらのコールバックが同時に実行されるように、何らかの並行性メカニズムがありますか? (たとえば、複数のスレッドを作成することにより、同時に実行する必要がある複数のコールバックの実行を高速化するため)
私のサーバーの場合、コールバックはデータベース ルックアップを実行します。データベース接続のデータベース ハンドルがイベント ループの外で初期化されました。私の懸念は、AnyEvent に同時実行メカニズムがある場合、1 つのコールバックが別のコールバックがデータベース ルックアップを終了してデータベース ハンドルが解放されるまで待機する必要があるため、コールバックを同時に実行できないことです。
PS答えてくれた「池上」に感謝します。

4

2 に答える 2

3

AnyEvent は同時実行性を作成しません。呼び出したときにイベントを処理します (例: ->recv)。

于 2014-01-15T13:58:02.113 に答える
0

池上が言ったように、AnyEvent には同時実行性がありません。どのイベント ループでも、イベントを「非同期に」処理できるため、コードを同時に実行することなく、複数の要求/操作/タイマーを同時に進行させることができます。イベントは常に順番に処理されます。

複数のタイマーが同時に期限切れになるという特定のケースでは、各タイマーは順番に処理され (期限切れ時間でソートされます)、すべての「期限切れの」タイマーはイベントループの反復ごとに処理されます - たとえば、ループの 208-213 行@CPAN で表示できる純粋な Perl 実装の .pm 。

于 2015-06-22T15:28:49.237 に答える