[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