On Thu, Jan 26, 2012 at 04:45:57PM +0200, Alexandr Gomoliako wrote:
> On 1/26/12, Dmitry Karasik <[email protected]> wrote:
> > context handle_connection(...);
> > tail {
> >     ... закончился readable/writable или ошибка ...
> >     again unless $socket-> is_closed;
> > }
> 
> > ( более полно в lib/IO/Lambda/HTTP.pm )
> 
> Догадывался, что так. Но тогда получается никакого смысла в этом нет,
> только усложнение кода. Можно писать этот же код без дополнительных
> абстракций, линейнее и менее разбросаннее:

Не соглашусь. Три контраргумента:

1: что если sysread/syswrite не смогут записать/прочитать все сразу - требуется
повторный вызов ::io 

2: что если http нужно заменить на https , в котором sysread/syswrite уже 
просто 
так не катит (т.к. для неблокирущего IO::Socket::SSL требуется шаманство)

3: наконец, линейность в коде внизу, какбы, не такая уж и линейная. Мне лично
нравится lambda-style линейность, особенно когда протокол усложняется.

Смысл в том чтобы было удобнее. Если наоборот, ну чтож, оно не доллар чтоб всем 
нравится )

/dk

> 
> tcp_server undef, 55555, sub {
>     my ($fh) = @_;
>     my ($w, $t, $buf, $handle_connection, $end);
> 
>     $handle_connection = sub {
> 
>         # readable
>         $t = AE::timer 5, 0, $end;
>         $w = AE::io $fh, 0, sub {
> 
>             my $len = sysread $fh, $buf, ...;
> 
>             # writable
>             $t = AE::timer 5, 0, $end;
>             $w = AE::io $fh, 1, sub {
> 
>                 my $len = syswrite $fh, $buf, ...;
> 
>                 # keepalive
>                 &$handle_connection();
>             };
>         };
>     };
> 
>     $end = sub {
>         undef $t;
>         undef $w;
>         ...
>     };
> };
> 
> А раз нету никаких ветвлений, то можно и просто подряд функции писать,
> как в примере раньше.
> -- 
> Moscow.pm mailing list
> [email protected] | http://moscow.pm.org

-- 
Sincerely,
        Dmitry Karasik

-- 
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить