0

そのため、イベント駆動型プログラミングへの進出に苦労しています。そのほとんどはまだ逐次的に考えているためですが、LWP::Protocol::AnyEvent::httpを使用しているときにコードを同期する方法を理解するのに苦労しており、理解の助けを求めています。以下は、私の基本的な理解不足を示す、私が作成できる最小のプログラムです。

use strict;
use warnings;

use 5.10.0;

use LWP::Protocol::AnyEvent::http;
use WWW::Mechanize;
use Coro qw(async);

my $url = "http://feedproxy.google.com/~r/PerlNews/~3/kqUb_rpU5dE/";

my $mech = WWW::Mechanize->new;
$mech->get($url);

my @cs;
foreach my $link ($mech->links) {
  my $c = async {
    say "Getting " . $link->url;
    my $ua = WWW::Mechanize->new;
    $ua->get($link->url);
  };
  push(@cs, $c);
} 

$_->join for (@cs);

foreachループに入る前に ->get が成功したことを確認するにはどうすればよいですか? モジュールの->get使用時にブロックされないため、すぐに戻ります。LWP::Protocol::AnyEvent::httpそのため->links、プログラムは終了するだけです。削除LWP::Protocol::AnyEvent::httpすると、プログラムは通常の順次プログラムのようにリンクを返し、速度も同様に遅くなります。

洞察をありがとう。

4

1 に答える 1

4

->getLWP::Protocol::AnyEvent::http モジュールを使用するとブロックされないため、すぐに戻ります。

それは真実ではない。通常通りブロックします。LWP::Protocol::AnyEvent::http は、WWW::Mechanize の動作にまったく影響を与えるべきではありません。WWW::Mechanize がブロックされている間、他の Coro スレッドと AnyEvent コールバックの実行を許可するだけです。

->getforeach ループに入る前に、 が成功したことを確認するにはどうすればよいですか?

あなたのコードはすでに完了するのを待っています。(実際、私はあなたのコードをドキュメントに追加したいと思っています!)

成功したかどうかを確認したい場合は、次を使用できます

die "Error" if !$mech->success;
于 2013-10-19T16:13:50.210 に答える