[Moscow.pm] Coro

Alexandr Gomoliako zzz на zzz.org.ua
Ср Янв 25 12:29:17 PST 2012


On Wed, Jan 25, 2012 at 12:18 AM, Mons Anderson <mons at rambler-co.ru> wrote:
> Если уж и приводить в пример альтернативный синтаксис, то не CPS, а
> IO::Lambda

Ну это тот же подход. Только можно не изобретать ничего, а просто
использовать функции и колбэки. В общем все равно идеального решения нет.

Как-то так можно для AE, читабельно и не очень сложно
(как бонус у такого кода достаточно хорошая производительность) :

tcp_server undef, 55555, sub {
    my ($fh, $host, $port) = @_;
    my ($start, $read_timeout, $read, $end);
    my ($t, $w, $buf);

    $start = sub {
        $t = AE::timer 15, 0, $read_timeout;
        $w = AE::io $fh, 0, $read;
    };

    $read_timeout = sub {
        ...
        &$end();
    };

    $read = sub {
        my $len = sysread $fh, $buf, ...;

        if ($len) {
            $t = AE::timer 15, 1, $write_timeout;
            $w = AE::io $fh, 0, $write;
            &$write();
            ...
        } elsif (...) {
            ...
            &$end();
        }
    }
    ...

    $end = sub {
        undef $w;
        undef $t;
        ...
    };

    &$start();
};


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