作者DarkKiller (System hacked)
看板Perl
标题[推荐] 推荐 Coro (以及 Coro::LWP) - 平行化的工具
时间Wed Oct 5 01:53:37 2011
*
软体网址:
http://search.cpan.org/dist/Coro/
*
说明:
假设有 100 个 url 要抓资料写到档案内:
use 5.010;
use LWP::Simple;
foreach my $url (@urls) {
my $content = get $url;
# 印出长度
say "$url: ", length $content;
}
如果平均一个 url 要跑一秒钟,这段程式码就要 100 秒。所以我们要想一个
方法让 Perl 可以平行同时抓很多 URL:
use 5.010;
use Coro;
use Coro::LWP;
use LWP::Simple;
my @tasks;
foreach my $url (@urls) {
push @tasks, async {
my $content = get $url;
# 印出长度
say "$url: ", length $content;
};
}
foreach (@tasks) {
$_->join;
}
在试着了解之前,应该要先了解 thread 的观念,因为 Coro 里有很多名词是
直接套用 thread 理论的名词,这边不会解释太多。
首先是「async」这个指令,这表示了中间这段程式码将会成为 lightweight
thread,另外他会传回 object 让你可以控制...
後面的「->join」(也就是 ->join(),这边的括弧可以省略) 表示要等到每个
lightweight thread 结束。
这样的方法可以节省大量的时间,但请特别注意:
这会造成对方伺服器的负担,
你必须在对方同意,或是控制在合理的连线数量范围下才能使用这个技巧。
关於连线数量的控制,可以参考 Coro::Semaphore 的说明。
*
细节:
实际上 Coro 并不是使用系统的 thread 实做平行化处理,而是透过
event-based library 模拟。
Coro::LWP 会换掉系统的 LWP 底层,遇到 I/O block 时会切到其他的 async
thread 继续跑,於是可以利用等待的时间去执行其他的程式,达到平行执行的
目的。
所以 WWW::Mechanize 这些底层使用 LWP 的 module 也都会受惠於 Coro::LWP
的「调包」。
常配合的 event-based library 包括 AnyEvent 与 EV,如果装完 AnyEvent
或是 EV 後,Coro 必须重新编过才会生效。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 210.242.135.97