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

->get立即返回,因为在使用 LWP::Protocol::AnyEvent::http 模块时它不会阻塞。

这不是真的。它像往常一样阻塞。LWP::Protocol::AnyEvent::http 根本不应该影响 WWW::Mechanize 的工作方式。它只允许在 WWW::Mechanize 被阻塞时执行其他 Coro 线程和 AnyEvent 回调。

在进入 foreach 循环之前如何确保->get成功?

您的代码已经在等待它完成。(事实上​​,我很想将您的代码添加到文档中!)

如果你想检查它是否成功,你可以使用

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