Я использую Mojolicious WebSocket для установления протокола обмена сообщениями между сервером и клиентом.Как отправить события 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) {
...
};
Является ли ваша «длительная работа» блокирующей сервер iloop? Это, несомненно, вызовет наблюдаемое поведение. Я не могу комментировать дальше, не видя больше кода. –
@Joel Berger, существует примерно 3k строк кода серверной логики и очень похоже на краткий пример выше. Да, эта операция блокирует ioloop. Я не нашел способ «обрабатывать события» (например, в Qt). Я пробовал использовать Mojo :: IOLoop таймер и потоки для отправки сообщений в websocket, но не повезло. – alexandrmoroz
Рассмотрите возможность переноса длинного вычисления в отдельный поток или (еще лучше), чтобы разбить его на ряд задач и обратных вызовов, позволяя собственному обработчику реактора/события управлять параллелизмом и отправлять/получать данные ввода-вывода. – Myst