[推薦] 推薦 Coro (以及 Coro::LWP) - 平行化ꨠ…

看板Perl作者 (System hacked)時間13年前 (2011/10/05 01:53), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
* 軟體網址: 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
文章代碼(AID): #1EYqWZzU (Perl)
文章代碼(AID): #1EYqWZzU (Perl)