[Moscow.pm] Coro

Dmitry Karasik dmitry на karasik.eu.org
Чт Янв 26 22:05:16 PST 2012


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