[Moscow.pm] Coro

Андрей П. Ковбович akovbovich на gmail.com
Пт Фев 3 11:39:51 PST 2012


Вы не это искали?

Вот пример из модуля 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