gpt4 book ai didi

perl - Catalyst 事件循环一次仅到达一个客户端

转载 作者:行者123 更新时间:2023-12-02 11:15:48 30 4
gpt4 key购买 nike

我正在开发 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* );
}

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

现在,我想我明白为什么这永远不会起作用 - 点击/trigger 的客户端不知道正在观看/stream 的所有其他客户端,因此我尝试使用的 write_fh 没有用。

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

或者我完全走错了路......?

最佳答案

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

您需要广播您的事件。看看AnyEvent::IRC看看如何做到这一点。

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

关于perl - Catalyst 事件循环一次仅到达一个客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24073450/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com