[Moscow.pm] HTTPD на короутинах
Ruslan Zakirov
ruz на bestpractical.com
Вс Май 27 15:04:14 PDT 2012
2012/5/27 Alexandr Gomoliako <zzz на zzz.org.ua>:
> Покажу еще пример, который на одних корутинах вообще не реализуем,
> случайно вспомнил:
>
> sub quorum_request {
> my $cb = pop;
> my $min = pop;
> my @res;
>
> foreach my $node (@_) {
> send_request $node, "something", sub {
> push @res, [shift];
>
> if (--$min == 0) {
> &$cb(@res);
> }
> };
> }
> }
>
> quorum_request "foo:1234", "bar:2345", "baz:80", 2, sub {
> # вернется сюда когда две любые ноды ответят.
> # т.е. если одна из трех упала, то она никого не задержит
После недолгого чтения доки:
---------------------------------------
use Coro;
use Coro::Timer qw(timeout);
sub quorum_request {
my $min = shift;
my @list = @_;
my $res = Coro::Channel->new;
foreach my $e ( @list ) {
async {
print "$e at ". time ."\n";
sleepfor($e);
print "done $e at ". time ."\n";
$res->put($e);
};
}
return map $res->get, 1 .. $min;
}
my @res = quorum_request(2, qw(3 9 5));
print join(', ', @res). "\n";
# вернется сюда :)
sub sleepfor {
my $timeout = timeout shift;
Coro::schedule; # wait until woken up or timeout
}
-------------------------------------
Если что-то пишут, значит это кому-нибудь нужно.
Все это обсуждение - сплошное словоблудие и никакого намека на конструктивность.
--
Best regards, Ruslan.
Подробная информация о списке рассылки Moscow-pm