Perl
Selenium
PhantomJS
AnyEvent
スクレイピングツール

Mojolicious で非同期にファイル収集プログラムを起動する

More than 3 years have passed since last update.
  • 記事タグを今後 スクレイピングツール で統一します
  • 厳密にはAnyEventを使ってませんが概念上同じということでタグ付けしています

前回までの課題

  • データ収集プログラムの実行時間があまりに遅くて全体処理が遅延する

これは、systemコマンドなどを & をつけて実行してバックグラウンドプロセスにすれば何となくうまくいきそうな感じはします。

ですが本番サーバのperlはperlbrewを使ってインストールをしている関係なのかどうかわかりませんが、コマンドライン上から実行するとcpanmでインストールしたモジュールをうまくuseできなくてエラーになってしまいます。

ファックです。

課題の解決法

エラーの追及は後日に回すとして、なんとかプログラムの実行待ちをせずにうまくいく方法はないかと考えていたところ、こんな記事を見つけました。

第13回 AnyEvent:イベント駆動モジュールの方言を吸収する

恥ずかしながらここで「AnyEvent」の存在を知り、イベント駆動という概念を思い出しました。
そして、Mojolicious には標準で上記の処理を可能にするモジュールがあるということで、折角ですから
使ってみることにしました。

Mojo::IOLoop

これを使って書き換えたRoot.pm が下記です(以下抜粋)。

Root.pm
# Web解析データの取得
my $kaiseki = Kaiseki::Model::Kaiseki->new;
eval{
    my @rows = $kaiseki->getCustomerinfo(1); # アナリティクス認証データの取得
     Mojo::IOLoop->timer(2 => sub { 
        $kaiseki_scrape->scrapeGadata($rows[0], $rows[1], $file);
      }
    );
};

最初に、use したMojo::IOLoop からtimerメソッドを呼び出し、無名sub で定義したscrapeGadata(データ収集プログラム)を起動し、$fileへ結果を書き出します。

これでプログラム遅延はある程度解消されました。データ収集プログラムはタイマー処理で2秒後に起動し、その
間に後続の処理を進めることができます。

次回は、ファイル読み出し処理を作成しようと思います。