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

时间:2015-12-04 21:35:47

标签: html5 perl websocket mojolicious

我使用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) {
    ...
};

2 个答案:

答案 0 :(得分:3)

There is两个例子如何使用两个模块中的一个:

  1. Mojo::IOLoop::ReadWriteFork
  2. Mojo::IOLoop::ForkCall
  3. 运行它执行命令:
    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;)。