[推薦] 推薦 Coro (以及 Coro::LWP) - 平行化ꨠ…
* 軟體網址:
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
Perl 近期熱門文章
PTT數位生活區 即時熱門文章