我使用Mojolicious 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) {
...
};
答案 0 :(得分:3)
There is两个例子如何使用两个模块中的一个:
运行它执行命令:
perl perl_ws_long_blocking_operation.pl daemon
<强> UPD。强>
如果您有许多长时间阻止操作,则应使用Mojo::IOLoop::Delay
:
Example of many long blocking operation
运行它执行命令:
morbo perl_ws_many_long_blocking_operations.pl
答案 1 :(得分:0)
我发现这对我有用: Mojo :: IOLoop-&gt; one_tick;
some_computation1();
$web_socket->send('computation1 end');
Mojo::IOLoop->one_tick;
UPD:或者可能最好将后台线程中的长时间操作分开(&#39; fork&#39;或&#39;延迟&#39;)。