2011/03/03

Coro::LWPのリクエスト数をCoro::SemaphoreSetで管理

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に戻してあげる必要があった

サンプルコード

#!/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 件のコメント:

コメントを投稿