Coro::LWP
use Coro::LWP
をするとLWPの諸々が勝手に上書きされるので非同期リクエストが可能になる
Coro::SemaphoreSet
Coro::SemaphoreSet
で同時接続数の管理を行えば、相手のサーバから怒られたりしないし、自分のリソース管理も楽になるでしょう。
scheduleについて
join
呼んだ方がいいのかは知らないけど、schedule
でやってみたかった
join
を使う場合はこんな感じ.
my @coros;
for ( 1 .. 10 ) {
push @coros, async { ... };
}
$_->join for @coros;
schedule
を実行した場合、main threadに制御が帰ってこないので、semaphoreの値をチェックして、$Coro::main->ready
でmain threadに戻してあげる必要があった
サンプルコード
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env perl | |
package Foo; | |
use strict; | |
use warnings; | |
use LWP::UserAgent; | |
my $agent = LWP::UserAgent->new; | |
sub request { | |
my $class = shift; | |
my $request = shift; | |
$agent->request($request); | |
} | |
package main; | |
use strict; | |
use warnings; | |
use Coro; | |
use Coro::LWP; | |
use Coro::SemaphoreSet; | |
use HTTP::Request::Common; | |
my @t = qw( | |
http://www.google.co.jp | |
http://www.yahoo.co.jp | |
http://localhost | |
); | |
my $lock = 2; | |
my $sem = Coro::SemaphoreSet->new($lock); | |
my @queue; | |
while ( my $uri = shift @t ) { | |
async { | |
$sem->down; | |
print $uri, "\n"; | |
my $res = Foo->request( HEAD $uri); | |
printf "%s => %s\n", $uri, $res->status_line; | |
$sem->up; | |
# wakeup main thread | |
$Coro::main->ready if !$sem->waiters && $sem->count == $lock; | |
}; | |
} | |
schedule; |
0 件のコメント:
コメントを投稿