LoginSignup
2
2

More than 5 years have passed since last update.

Perl6で Channelプログラミング

Posted at

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リソースを喰ったり問題が山積みです. 利用の際はご注意ください. クリスマスまでにちゃんと動くのだろうか :sweat_smile:

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2