[Moscow.pm] Coro + AnyEvent --- Что не так

Ivan Petrov i.petro.77.00 на gmail.com
Чт Окт 15 13:55:20 PDT 2015


> did you try to block inside an event loop callback?

основная идея - из калбаков AE не делать ничего кроме уведомлений.

соответственно что нельзя делать
 - писать в Channel
 - трогать что угодно что может позвать cede/schedule

то есть идеология такая

 - если пишем однократный ожидальщик то используем стандартный
   механизм Coro::rouse_*
 - если пишем многократный ожидальщик (например сервер), то лучше
   всего использовать совокупность schedule + ready


то есть заводим

my $watcher;
my @tasks;


sub do_task {
    тут можно создавать async, писать в каналы итп
}

async {
    while (1) {
    	$watcher = $Coro::current;
    	Coro::schedule;
    	while(@tasks) {
            do_task(shift @tasks);
        }
    }
};

В калбеке приема соединения как-то так:

sub {
    my ($fh) = @_;
    push @tasks => $fh;
    $watcher->ready if $watcher;
    $watcher->undef;
}


Подробная информация о списке рассылки Moscow-pm