我使用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) {
...
};
有两个例子可以说明如何使用两个模块之一:
- Mojo::IOLoop::ReadWriteFork
- 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:或者可能会更好地在后台线程中分离长操作("标记"或"延迟")。