[Moscow.pm] Coro
Dmitry Karasik
dmitry на karasik.eu.org
Ср Янв 25 13:28:56 PST 2012
On Wed, Jan 25, 2012 at 10:29:17PM +0200, Alexandr Gomoliako wrote:
> On Wed, Jan 25, 2012 at 12:18 AM, Mons Anderson <mons на rambler-co.ru> wrote:
> > Если уж и приводить в пример альтернативный синтаксис, то не CPS, а
> > IO::Lambda
>
> Ну это тот же подход. Только можно не изобретать ничего, а просто
> использовать функции и колбэки.
Ну попрошу все же различать - IO::Lambda это гораздо больше чем просто коллбеки -
в частности, это возможность последовательность этих коллбэков всячески оборачивать,
комбинировать, отменять, ждать выполнения их всех а не просто выстрелить кучу, и многая,
и многая другая. А AnyEvent может быть использован как бакэнд, так что скорость та же.
За читабельность, ну да, это субъективно .. tcp_server'а там нет, но если б был,
то аналогичный код вызывался бы где-то так:
sub handle_connection
{
my $socket = shift;
lambda {
context $socket, $timeout;
readable {
return 'timeout' unless shift;
sysread $socket, ...
writable {
return 'timeout' unless shift;
syswrite $socket, ...
}}}
}
lambda {
context port => 55555, timeout => $timeout;
tcp_server {
context handle_connection(@_);
tail {};
again;
}}
т.е. сервер отдельно, обработчик отдельно, и код обработчика линейный а не разбросанный.
/dk
>
> Как-то так можно для 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 mailing list
> moscow-pm на pm.org | http://moscow.pm.org
--
Sincerely,
Dmitry Karasik
Подробная информация о списке рассылки Moscow-pm