Catalyst事件循环一次只到达一个客户端

Rya*_*yan 6 perl catalyst psgi

我正在开发一个Catalyst/psgi应用程序,它可以很好地利用异步流,但不仅仅是一个简单的计时器(比如这里:http://www.catalystframework.org/calendar/2013/13),我有点儿难以理解如何实施更多"全球"事件.

通过全球事件,我的意思是:

  1. 定期计时器,对所有客户端都是相同的
  2. 单个客户端访问给定页面(但更新所有客户端)
  3. 文件统计观察程序,它将在文件更改时更新所有客户端.

如果我错了,请纠正我,但对我来说,这些似乎与上面链接的示例非常不同,这将给每个客户一个不同的计数器.我想让事件"全面发生".

我尝试过的一个例子(使用上面列表中的#2):

has 'write_fh' => ( is => 'rw', predicate => 'has_write_fh' );

sub events : Path('/stream') Args(0) {
    my ( $self, $c ) = @_;
    $c->res->body("");
    $c->res->content_type('text/event-stream');

    $self->write_fh( $c->res->write_fh() );
}

sub trigger : Path('/trigger') : Args(0) {
    my ( $self, $c ) = @_;

    $self->write_fh->write( *the event string* );
}
Run Code Online (Sandbox Code Playgroud)

当我运行它时,它实际上比我预期的更进一步 - 事件确实被触发,但不可靠.打开两个浏览器,有时会将事件发送到一个,有时发送到另一个.

现在,我想我明白为什么这样做永远不会有效 - 遇到/触发的客户端,不知道正在观看/流的所有其他客户端,所以我尝试使用的write_fh没用.

但是,如果每个客户的请求都在其自己的包含气泡中,我如何从其他请求访问其流?

或者我完全走错了轨道......?

小智 0

write_fh 的问题是该事件是单播的 - 一旦任何人收到它,就不会再收到它。因此其中一个连接可以捕获它,而另一个连接则不能。

您需要广播您的活动。查看AnyEvent::IRC以了解如何完成它。

(请注意,它是为旧版本的 AnyEvent 编写的,但它应该仍然有效)