Pixel Pedals of Tomakomai

北海道苫小牧市出身の初老の日常

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

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

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") に書き換えたりする必要があります。