perlでマルチスレッド

最近のperlはスレッドが使えるらしい。これは面白そうだ。

というのも、現在エクセルで作ってあるシステムは岡三RSSを使ってリアルタイムの板情報を取得しているのだが、これはどうも安定感に不安がある上に、そもそもリアルタイムである必要がないという事実があるのだ。

シストレを行う上で過去のデータによって検証するという作業が重要なのだが、この過去のデータとしてどんなものが入手可能かというと、結局のところ日足のみである。つまり日中の値動きなど追う必要はないのだ。だから株価取得のために不安定なRSSを使わずにwebを使えばいいと。

webからのデータの取得はcurlを使うのだが、複数銘柄のデータ取得を順番に行っていては時間が掛かる。そこでスレッドで並列動作させちゃえと。

なんだけれど、やってみるとむしろ遅くなった。5銘柄の情報を一気に取ろうとしたのだが、横着が過ぎたか。
そこで時間差で実行してみたところ、満足行く結果を得ることができた。

時間
スレッド無し 4.5sくらい
スレッド有り 8.5sくらい
スレッド時間差 2.5sくらい

($th1) = threads->new(\&get_hiashi, $codes[0]);
select undef, undef, undef, 0.1;
($th2) = threads->new(\&get_hiashi, $codes[1]);
select undef, undef, undef, 0.1;
($th3) = threads->new(\&get_hiashi, $codes[2]);
select undef, undef, undef, 0.1;
($th4) = threads->new(\&get_hiashi, $codes[3]);
select undef, undef, undef, 0.1;
($th5) = threads->new(\&get_hiashi, $codes[4]);
@hiashi1 = $th1->join;
@hiashi2 = $th2->join;
@hiashi3 = $th3->join;
@hiashi4 = $th4->join;
@hiashi5 = $th5->join;

こんな感じ。