Perl AnyEvent внутренности параллелизма

У меня есть сервер, который создает объект-наблюдатель "AnyEvent timer" на каждом клиентском соединении (добавляет его в цикл 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);
       }
);

...

Таким образом, обратный вызов будет выполняться каждые $ интервал секунд. Если клиентов много, некоторые обратные вызовы должны быть выполнены одновременно. Как AnyEvent справляется с этим? Выполняет ли он эти обратные вызовы один за другим ИЛИ в этом случае существует какой-то механизм параллелизма, чтобы эти обратные вызовы выполнялись одновременно? (например, для ускорения выполнения нескольких обратных вызовов, которые должны выполняться одновременно, путем создания нескольких потоков)
В случае моего сервера обратный вызов выполняет поиск в базе данных. Дескриптор базы данных для соединения с базой данных был инициализирован вне цикла событий. Меня беспокоит то, что если в AnyEvent существует какой-либо механизм параллелизма, то обратные вызовы не могут выполняться одновременно, потому что один обратный вызов должен ждать, пока другой завершит поиск в базе данных и дескриптор базы данных будет свободен.
PS Спасибо "икегами" за ответ.

2 ответа

AnyEvent не создает параллелизма. Он обрабатывает события, когда вы звоните в него (например, ->recv).

Как сказал икегами, в AnyEvent нет параллелизма. Любой цикл обработки событий дает вам возможность обрабатывать события "асинхронно", поэтому вы можете одновременно выполнять несколько запросов / операций / таймеров, не выполняя одновременного выполнения кода. События всегда обрабатываются последовательно.

Для вашего конкретного случая одновременного истечения срока действия нескольких таймеров - каждый таймер обрабатывается по очереди (они сортируются по времени истечения), а все таймеры с истекшим сроком действия обрабатываются на каждой итерации цикла событий - например, строки 208-213 цикла.pm для чистой реализации Perl, которую вы можете просмотреть @ CPAN.

Другие вопросы по тегам