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.