[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