[Moscow.pm] Coro

Dmitry Karasik dmitry на karasik.eu.org
Пт Фев 3 23:40:30 PST 2012


Теоретически это как раз то что нужно, а практически проблема в убогости
перлового source filtering, который Combinator использует. При нормальных
макросах вложенность такого рода разруливалась бы намного проще.

/dk

On Fri, Feb 03, 2012 at 11:39:51PM +0400, Андрей П. Ковбович wrote:
> Вы не это искали?
> 
> Вот пример из модуля https://metacpan.org/module/Combinator
> 
> When you are tired of writing layered closures
> 
> use AnyEvent::DBI;
> ...
> $dbh->exec("select ...", sub {
>     ...
>     $dbh->exec("select ...", sub {
>         ...
>         $dbh->exec("select ...", sub {
>             ...
>             $dbh->exec("select ...", sub {
>                 ...
>             });
>         });
>     });
> });
> 
> You can achieve that like this:
> 
> use Combinator;
> use AnyEvent::DBI;
> ...
> {{com
>     $dbh->exec("select ...", {{next}});
>     ...
>   --ser
>     $dbh->exec("select ...", {{next}});
>     ...
>   --ser
>     $dbh->exec("select ...", {{next}});
>     ...
>   --ser
>     $dbh->exec("select ...", {{next}});
>     ...
> }}com
> 
> 27 января 2012 г. 10:05 пользователь Dmitry Karasik
> <dmitry на karasik.eu.org> написал:
> > On Fri, Jan 27, 2012 at 12:46:42AM +0200, Alexandr Gomoliako wrote:
> >> > Этого я не понимаю. Как AE решает проблему с большим количеством коллбэков
> >> > и их ожиданиями, синхронизацией между собой, и поочередным (т.е. не
> >> > параллельным) исполнением?
> >>
> >> AE никак не решает, он здесь просто для примера.
> >
> > Ну так и я о том же - а лямбда решает. К чему собственно я и веду - у них
> > разные подходы, и разные решения, похожие только в том что и там и там коллбэки.
> >
> >> Если нужно много подождать, можно просто сделать счетчик. Но в целом
> >> все очень просто и даже внешне похоже на лямбду:
> >
> > Да я как бы и не спорю что нельзя ;)
> >
> >>
> >> sub request {
> >>     my ($host, $port, $buf, $cb) = @_;
> >>     my ($fh, $w, $t, $callback);
> >>
> >>     $callback = sub {
> >>         &$cb;
> >>         undef $t;
> >>         undef $w;
> >>     };
> >>
> >>     tcp_connect $host, $port, sub {
> >>         ($fh) = @_;
> >>
> >>         # writable
> >>         $t = AE::timer 5, 0, $callback;
> >>         $w = AE::io $fh, 1, sub {
> >>
> >>             my $len = syswrite $fh, $buf, ...;
> >>
> >>             # readable
> >>             $t = AE::timer 5, 0, $callback;
> >>             $w = AE::io $fh, 0, sub {
> >>
> >>                 my $len = sysread $fh, $buf, ...;
> >>
> >>                 &$callback($buf);
> >>             };
> >>         };
> >>     };
> >> }
> >>
> >> sub do_some {
> >>     my ($arg, $cb) = @_;
> >>
> >>     request '1.2.3.4', 123, "foo, $arg", sub {
> >>         my ($foo) = @_;
> >>
> >>         request '2.3.4.5', 123, "bar, $foo", sub {
> >>             my ($bar) = @_;
> >>
> >>             &$cb($foo, $bar);
> >>         };
> >>     };
> >> }
> >>
> >> sub do_many {
> >>     my ($arg, $cb) = @_;
> >>     my (@res, $cnt);
> >>
> >>     my $gather = sub {
> >>         push @res, \@_;
> >>         &$cb(@res)  if --$cnt == 0;
> >>     };
> >>
> >>     $cnt++;
> >>     request '1.2.3.4', 123, "foo, $arg", $gather;
> >>
> >>     $cnt++;
> >>     request '1.2.3.4', 123, "foo, $arg", $gather;
> >>
> >>     $cnt++;
> >>     request '1.2.3.4', 123, "foo, $arg", $gather;
> >> }
> >>
> >>
> >> do_some "foobar", sub {
> >>     print "got @_\n";
> >>
> >>     do_many "baz", sub {
> >>         print "got many @_\n";
> >>     };
> >> };
> >> --
> >> Moscow.pm mailing list
> >> moscow-pm на pm.org | http://moscow.pm.org
> >
> > --
> > Sincerely,
> >        Dmitry Karasik
> >
> > --
> > Moscow.pm mailing list
> > moscow-pm на pm.org | http://moscow.pm.org
> -- 
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org

-- 
Sincerely,
	Dmitry Karasik



Подробная информация о списке рассылки Moscow-pm