私はAnyEventを学び始め、いくつかのトローブを持っています。 I完全に誤解どのようにその可能性を得るために、非同期利益、FE:出力でPerl AnyEventコールバックの待ち時間サブで、どのように非同期を実行しますか?
#!/usr/bin/env perl
package LatencySub;
use strict;
use warnings;
use AnyEvent;
# sub for emulate latency - is it right way?
sub do_delay{
my ($name, $delay) = (@_);
my $cv = AE::cv;
my $timer = AE::timer $delay, 0, sub { $cv->send() };
$cv->recv;
return $name.' proceed, delay is '.$delay;
};
package main;
use 5.12.0;
use warnings;
use Smart::Comments;
use AnyEvent;
my @list = (
{ name => 'first', delay => 1 },
{ name => 'second', delay => 1 },
{ name => 'third', delay => 2 }
);
sub process_cb {
my ($name, $delay, $cb) = @_;
my $result = LatencySub::do_delay($name, $delay);
$cb->($result);
}
my %result;
my $cv = AE::cv;
# outer loop
$cv->begin (sub { shift->send (\%result) });
my $before_time = AE::time;
### foreach start...
foreach my $entity (@list) {
$cv->begin;
process_cb (
$entity->{'name'},
$entity->{'delay'},
sub {
$result{$entity->{'name'}} = shift;
$cv->end;
}
);
}
### foreach end...
$cv->end;
my $time_all = AE::time - $before_time;
### $time_all
### %result
は、私が得た:
### foreach start...
### foreach end...
### $time_all: '4.02105116844177'
### %result: {
### first => 'first proceed, delay is 1',
### second => 'second proceed, delay is 1',
### third => 'third proceed, delay is 2'
### }
すべての遅延和(1 + 1 + 2)EQ $ time_all - 4秒。 それで、全く利益はありません。
「正しい」コールバックを作成するにはどうすればいいですか(それは可能でしょうか)。
Aha!それは私が望むものにもっと似ています。なぜ私がそこに必要なのかを理解することは非常に重要だと思います。$ cv-> begin; my $ timer = AE :: timer $ delay、0、sub {warn "$ name \ n"; $ cv-> end}; return $ timer; " (単にシンプルなビューのために)返すAE :: timerオブジェクト? – Meettya
perldoc AnyEventで$ cv-> beginのドキュメントを参照してください。 $ cv-> beginはカウンタをインクリメントし、$ cv-> endはカウンタをデクリメントし、カウンタが0になると条件変数を起動します。 また、AE :: timerオブジェクトを保存して、範囲。 – perlman