[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