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



我正在开发一个可以充分利用异步流的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* );
}

当我运行这个时,它实际上比我预期的要远——事件确实被触发了,但不可靠。在两个浏览器都打开的情况下,事件有时发送给其中一个浏览器,有时发送给另一个浏览器。

现在,我想我明白为什么这永远不会工作-客户端点击/触发,不知道所有其他客户端正在观看/流,所以我试图使用的write_fh是没有用的。

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

还是我完全走错了路…?

write_fh的问题是这个事件是单播的——一旦它被任何人接收到,它就不会再被接收了。因此,其中一个连接捕获它,而另一个则没有。

你需要广播你的事件。看一下AnyEvent::IRC,看看它是如何做到的。

(注意,它是为旧版本的AnyEvent编写的,但它应该仍然可以工作)

相关内容

  • 没有找到相关文章