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"; }