> 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 mailing list
[email protected] | http://moscow.pm.org

Ответить