Perlで非同期処理を行う
書籍を作るときに、Webページのスクレイピングしたりアイコン画像をダウンロードしたりといった感じでPerlスクリプトを使うことがしばしばあります。Perlを使う前は一つ一つコピペしていたのですから、大きな進化です。
ただ、取得するデータの件数が多くなると、それでも待たされる時間が長くなってしまいます。
どうにかならないのかなと思って調べていたら、非同期処理というのがよいみたいですね。AnyEventモジュールというのが一般的に使われているらしいので、適当にスクリプトを書いてみました。
#!/usr/bin/env perl use 5.12.3; use warnings; use utf8; use open IO => qw/:utf8 :std/; use AnyEvent; my $done = AnyEvent->condvar; my $count = 0; my $timer = AnyEvent->timer( after => 5, interval => 2, cb => sub { say "イベントキタ―!" if $count < 1; say "イベント $count 回目!"; $count++; $done->send if $count > 5 } ); my $hima; $hima = AnyEvent->idle( cb => sub { say "ひまー"; undef $hima; } ); say "スクリプト開始! ... 5秒待ちます"; $done->recv; say "終わり−!";
ここではタイマーとアイドル時に規定の関数を実行するよう設定してみました。ほかにも、IOの空き時間やシステムの信号を検知、特定のプロセス終了後などでも関数を実行することができるようです。
これを利用して非同期でスクレイピングの実行や画像をダウンロードするスクリプトを書いてみようと思います。