我有下面的子例程,並有APPX 20個線程具有不同的URL調用它(這一分屬於一個包,每個線程調用封裝的不同實例):AnyEvent在多線程環境
sub get_urls {
my ($self,$url,$depth) = @_;
my $cv = AnyEvent->condvar;
my @data;
my %visited;
my $hostname = URI->new($url)->host();
my $tr_cb;
my ($b,$e) = (0,0);
return unless($depth);
# This code-ref is recursive!
$tr_cb = sub {
my $sitem = shift;
my $depth = shift;
return if (0 == $depth--);
foreach my $site (@$sitem) {
if (exists($visited{$site})) {
next;
}
$b++;
$visited{$site} = 1;
$cv->begin;
AnyEvent::HTTP::http_get ($site, timeout => 1, sub {
my ($body, $hdr) = @_;
if ($hdr->{Status} =~ m/^2/) {
my $extor = HTML::SimpleLinkExtor->new();
my @links;
print "E = $e | B = $b\n";
#print "[REC_DEPTH:$depth]Working on $site\n";
$extor->parse($body);
@links = map { URI->new_abs($_,$site)->as_string }
grep { length > 2 } $extor->links();
push(@data,@links);
$tr_cb->([map { $_->[2] }
grep { $_->[0] eq $_->[1] }
map { [$hostname,URI->new($_)->host(),$_] } @links],$depth);
}
$e++;
$cv->end;
});
}
};
$tr_cb->([$url],$depth);
$cv->recv;
print "Got total of " . @data . " links\n";
}
的($b,$e)
變量僅用於測試。 問題是,經過一段時間,似乎'開始'的數量與'結束'的數量不匹配,因此它永遠不會通過$cv->recv
... 我對AnyEvent和事件編程有點新,似乎不能解決我的問題。
感謝,
你爲什麼將線程與異步的事件驅動庫結合起來?只要您不遞歸recv,就可以在單線程應用程序中創建多個condvars。 – MkV
很好的問題,實際上我的意思是流程,不是線程,它是一個錯字,我分叉,但我認爲它是錯誤的。 – snoofkin