Goでプログラムを書いた人であれば並列処理を書くのであれば Channelを使いたいと思いますよね. Perl6でもそれが可能です. Perl6ではずばり Channelというクラスが標準で提供されています. Channelを使ったサンプルプログラミングを示します.
コード例
並列に GETを行い, その Statusを調べるプログラムを以下に示します.
use v6;
use HTTP::Tinyish;
my @urls = (
"http://www.vim.org",
"https://www.gnu.org/software/emacs/",
"http://sakura-editor.sourceforge.net/",
"http://syohex.org/not-found",
);
my $c = Channel.new;
for @urls -> $url {
say "Fetch: $url";
start {
my $agent = HTTP::Tinyish.new;
my %res = $agent.get($url);
$c.send($url => %res<status>);
}
}
for @urls {
my $r = $c.receive;
printf "URL: %s, StatusCode: %d\n", $r.key, $r.value;
}
-
Channel.new
で新しいチャネルを作成. -
Channel#send
でチャネルにメッセージを送信 -
Channel#receive
でチャネルからメッセージを受信
結果
並列に取得しているので実行結果は実行のたびに異なることがあります.
(2015年 12月 8日現在の rakudoの実装では本体の問題により大量の警告が出ます)
Fetch: http://www.vim.org
Fetch: https://www.gnu.org/software/emacs/
Fetch: http://sakura-editor.sourceforge.net/
Fetch: http://syohex.org/not-found
URL: http://syohex.org/not-found, StatusCode: 404
URL: http://sakura-editor.sourceforge.net/, StatusCode: 200
URL: http://www.vim.org, StatusCode: 200
URL: https://www.gnu.org/software/emacs/, StatusCode: 200
おわりに
Perl 6での Channelを使ったプログラミングを紹介しました. Goのような感じで並列処理を書くことができます.
Perl5では並列プログラムを書くことが非常に面倒というかそもそもほとんどの人が使っていないという状態でしたが, Perl6では Channelの他にも便利な並列処理プリミティブがあり並列処理がとても簡単に書くことができます.
2015年 12月 8日現在の実装では並列には動いても異常に CPUリソースを喰ったり問題が山積みです. 利用の際はご注意ください. クリスマスまでにちゃんと動くのだろうか