[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