読者です 読者をやめる 読者になる 読者になる

POE,AnyEvent,Coro,Tatsumakiに関して

PSGI/Plack Tatsumaki perl

POE,AnyEvent,Coro,Tatsumakiの関係性がいまいち掴みきれていません。
ちょっと調べたことメモ。

イベントループのプログラミング

  • イベントループとはイベントを見張るループ
  • プログラマはイベントに対応したプログラムを作成する
  • イベントループでイベントを感知すると、対応するプログラムを起動する

POE (Perl Object Enveronment)


イベントループがあるプログラムを作成するためのモジュール。
このモジュールを使って、イベントに対応するプログラムを作成していく。

引用:POE:「Perl萌え〜」の略ではなく

POE::Session->create(
    heap => { obj => MyObj->new() },
    inline_states => {
        _start  => sub { $_[KERNEL]->yield('tick') },
        do_task => sub { $_[HEAP]{obj}->do_task },
        tick    => sub {
            return unless @{$_[HEAP]{obj}{files}};
            print "tick\n";
            $_[KERNEL]->yield('do_task') if $_[HEAP]{counter}++ % 2;
            $_[KERNEL]->delay(tick => 1);
        },
    },
);

AnyEvent


イベントループがあるプログラムを作成するためのモジュール。
イベントループに関する処理は、特定のモジュールに依存していない。
イベントループプログラミングのフレームワーク

イベントループで使えるモジュールは下記のようなもの?

  • AnyEvent::Impl::Perl
  • Coro

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

use strict;
use warnings;
use AnyEvent::Impl::Perl;
use AnyEvent;

my $cv = AnyEvent->condvar;
my $io; $io = AnyEvent->io(
    fh   => \*STDIN,
    poll => 'r',
    cb   => sub {
        chomp(my $input = <STDIN>);
        undef $io;
        $cv->send($input);
    },
);

if (defined(my $input = $cv->recv)) {
    print "got: [$input]\n";
}

Coro (Coroutine)


これもイベントループプログラミングのフレームワーク
非同期プログラミングに関するメソッドが定義されている?
内部でAnyEventを使用しているらしい。
AnyEventと組み合わせて、イベントループ+非同期プログラムを作成する?

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

use strict;
use warnings;
use EV;
use Coro;
use Coro::AnyEvent;
use Coro::Handle;

my @cvs;
my $out = unblock \*STDOUT;
my $place = 0;
foreach my $i (1..10) {
    $cvs[$i] = AnyEvent->condvar;
    async {
        my $count = 0;
        until ($count > 10) {
            Coro::AnyEvent::sleep rand(1);
            $out->syswrite("ponie $i => $count\n");
            $count++;
            cede;
        };
        $cvs[$i]->send(++$place);
    };
}

my @places;
foreach my $i (1..10) {
    $places[ $cvs[$i]->recv ] = $i;
}

print "----------------\n";
foreach my $i (1..10) {
    print "$i => ponie $places[$i]\n";
}

Tatsumaki


AnyEventを使ったWebアプリケーションを作成するためのフレームワーク
PSGIに準拠しているフレームワークなので、色々なサーバや実行環境で動作するWebアプリケーションが書けるようにもなる。