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

时间:2014-06-06 02:54:46

标签: perl catalyst psgi

我正在使用Catalyst / psgi应用程序来充分利用异步流媒体,但是超出了简单的计时器(例如:http://www.catalystframework.org/calendar/2013/13),我&# 39;对于如何实施更多"全球"事件

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

  1. 对所有客户端都相同的定期计时器
  2. 由单个客户端访问给定页面(但更新所有客户端)
  3. 文件统计观察程序,它将在文件更改时更新所有客户端。
  4. 如果我错了,请纠正我,但对我而言,这些似乎与上面链接的示例非常不同,这将为每个客户提供一个不同的计数器。我希望能够全面发生事件。"

    我尝试过的一个例子(使用上面列表中的#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不是是有用的。

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

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

1 个答案:

答案 0 :(得分:0)

你对write_fh的问题是这个事件是单一的 - 一旦被任何人接收,它就不再被接收了。所以其中一个连接抓住它,另一个只是不要。

您需要播放您的活动。看看AnyEvent::IRC,看看它是如何完成的。

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