[Moscow.pm] Coro
Dmitry Karasik
dmitry на karasik.eu.org
Чт Янв 26 07:18:29 PST 2012
On Thu, Jan 26, 2012 at 04:45:57PM +0200, Alexandr Gomoliako wrote:
> On 1/26/12, Dmitry Karasik <dmitry на karasik.eu.org> 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
> moscow-pm на pm.org | http://moscow.pm.org
--
Sincerely,
Dmitry Karasik
Подробная информация о списке рассылки Moscow-pm