如何从阻塞操作发送WebSocket事件?(需要设计建议)



我使用Mojolicus WebSocket来建立服务器-客户端消息传递协议。

服务器上有长时间的操作,我想在客户端更新它的进度。

在服务器端代码的几个方面,我调用$web_socket->send(...)并在客户端ws.onmessage = function (event) {...}; 上处理它

一切都很好,但不是实时的:所有消息都是由客户端在一个大批量列表中接收的,并且只有在整个服务器端脚本完成之后。

服务器端逻辑:

some_computation1();
$web_socket->send('computation1 end');
...
some_computation15();
$web_socket->send('computation15 end');
...
some_computation100();
$web_socket->send('computation100 end. All ok!');

客户端:

ws = new WebSocket(url);
ws.onmessage = function (event) {
    $('#log_view').append('<p>' + event.data + '</p>');
};
ws.onopen = function (event) {
    ... 
};
ws.onclose = function (event) {
    ...
};

有两个例子可以说明如何使用两个模块之一:

  1. Mojo::IOLoop::ReadWriteFork
  2. Mojo::IOLoop::ForkCall

要运行它,请执行命令:
perl perl_ws_long_blocking_operation.pl daemon

上升如果你有很多长阻塞操作,你应该使用Mojo::IOLoop::Delay:

多次长阻塞操作示例

要运行它,请执行命令:

morbo perl_ws_many_long_blocking_operations.pl

我发现这对我有用:Mojo::IOLoop->one_tick

some_computation1();
$web_socket->send('computation1 end');
Mojo::IOLoop->one_tick;

UPD:或者可能会更好地在后台线程中分离长操作("标记"或"延迟")。

相关内容

  • 没有找到相关文章

最新更新