読者です 読者をやめる 読者になる 読者になる

北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

Coro::LWP って何か調べてみた

perl

空前の非同期ブームに乗っかってみます。

Coro::LWPのドキュメントはやたらあっさりしてるんですが、以下のようなコードで効果がわかります。

use strict;
use warnings;
use Coro;
# use Coro::LWP;
use LWP::UserAgent;

async {
	print "Hi\n";
};

my $ua = LWP::UserAgent->new;
my $res = $ua->get("http://d.hatena.ne.jp/hiratara/");
print $res->title, "\n";

cede;

このまま実行すると、

a geek born in Tomakomai
Hi

となりますが、 use Coro::LWP の行を有効にすると、

Hi
a geek born in Tomakomai

となります。つまり、LWPがブロックせずに別スレッドに処理を譲ってくれるようになります。便利ですね!

9/22 追記

Coro::Handle::unblock も同じような効果です。 while <$fh> なループを書いた時に、スレッドの切り替えが発生するようになります。ただし、Coro::Handle の場合は、 $fh = unblock $fh; とした上で、 <$fh> を $fh->readline にしたり、 print $fh "hoge" を $fh->print("hoge") に書き換えたりする必要があります。