2010-11-06

[perl] Coro::Specific の使いどころについて

Coro とは、AnyEventJSON::XS で有名な Marc Lehmann 作の、Perlにおいて、協調型スレッド(簡単な方のスレッド) を実現して、背後で AnyEvent が仕事をしながら、プログラマ側からは今までのブロッキング方式と思って書けるようにするためのモジュールです。

本体に同梱されている Coro::Specific というモジュールを使うと、今まで fork システムコールで多重化していた Net::Server のような、サーバーのインスタンスが1つで、それぞれのクライアントがプロパティをちょこっと書き換える型のサーバーを Coro 化するのに役に立ちます。

実際に、Coro における PSGI サーバー実装である Corona で使っている、Net::Server::Coro では、以下のようにして特定のプロパティをコルーチンごとに別々に設定できるようにしています。

# Net::Server::Coro::post_bind_hook 付近より抜粋
# $self はサーバーのインスタンス

foreach my $key (qw(client sockaddr sockport peeraddr peerport peerhost)) {
    tie $self->{server}{$key}, Coro::Specific::;
}