[Moscow.pm] Coro

Alexandr Gomoliako zzz на zzz.org.ua
Чт Янв 26 14:46:42 PST 2012


> Этого я не понимаю. Как AE решает проблему с большим количеством коллбэков
> и их ожиданиями, синхронизацией между собой, и поочередным (т.е. не
> параллельным) исполнением?

AE никак не решает, он здесь просто для примера.
Если нужно много подождать, можно просто сделать счетчик. Но в целом
все очень просто и даже внешне похоже на лямбду:

sub request {
    my ($host, $port, $buf, $cb) = @_;
    my ($fh, $w, $t, $callback);

    $callback = sub {
        &$cb;
        undef $t;
        undef $w;
    };

    tcp_connect $host, $port, sub {
        ($fh) = @_;

        # writable
        $t = AE::timer 5, 0, $callback;
        $w = AE::io $fh, 1, sub {

            my $len = syswrite $fh, $buf, ...;

            # readable
            $t = AE::timer 5, 0, $callback;
            $w = AE::io $fh, 0, sub {

                my $len = sysread $fh, $buf, ...;

                &$callback($buf);
            };
        };
    };
}

sub do_some {
    my ($arg, $cb) = @_;

    request '1.2.3.4', 123, "foo, $arg", sub {
        my ($foo) = @_;

        request '2.3.4.5', 123, "bar, $foo", sub {
            my ($bar) = @_;

            &$cb($foo, $bar);
        };
    };
}

sub do_many {
    my ($arg, $cb) = @_;
    my (@res, $cnt);

    my $gather = sub {
        push @res, \@_;
        &$cb(@res)  if --$cnt == 0;
    };

    $cnt++;
    request '1.2.3.4', 123, "foo, $arg", $gather;

    $cnt++;
    request '1.2.3.4', 123, "foo, $arg", $gather;

    $cnt++;
    request '1.2.3.4', 123, "foo, $arg", $gather;
}


do_some "foobar", sub {
    print "got @_\n";

    do_many "baz", sub {
        print "got many @_\n";
    };
};


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