Async::Queueをリリース

PerlモジュールAsync::Queueをリリースした。

このモジュールは、あらかじめ登録した非同期処理を立て続けに実行する際に、実行並列度に制限をかけてFIFO実行してくれる、というもの。
ぶっちゃけた話、async.jsのqueueオブジェクトと同じ。(同じAPIを切ってある)

以下、使用例。

use strict;
use warnings;
use AnyEvent;
use AnyEvent::HTTP;
use Async::Queue;

my $q = Async::Queue->new(concurrency => 3, worker => sub {
    my ($url, $callback) = @_;
    print STDERR "Start $url\n";
    http_get $url, sub {
        my ($data, $headers) = @_;
        print STDERR "End $url\n";
        $callback->($data);
    };
});

my @urls = (
    'http://www.debian.org/',
    'http://www.ubuntu.com/',
    'http://fedoraproject.org/',
    'http://www.opensuse.org/',
    'http://www.centos.org/',
    'http://www.slackware.com/',
    'http://www.gentoo.org/',
    'http://www.archlinux.org/',
    'http://trisquel.info/',
);

my %results = ();
my $cv = AnyEvent->condvar;
foreach my $url (@urls) {
    $cv->begin();
    $q->push($url, sub {
        my ($data) = @_;
        $results{$url} = $data;
        $cv->end();
    });
}
$cv->recv;

foreach my $key (keys %results) {
    print STDERR "$key: " . length($results{$key}) . "bytes\n";
}

AnyEventを使った例では定番の、並列ダウンローダ。大量のURLを無制限に並列ダウンロードするとさすがにクライアントホストやネットワークに負荷がかかるので、Async::Queueによって並列度を3に制限している。