Аналог многопоточности и socket.io
Добрый день. Подскажите, как реализовать задачу: есть сокет сервер(использовал socket.io, принцип работы понятен и прозрачен), где при подключение нового клиента и получении данных необходимо создать отдельную задачу(поток) для выполнения подзадач. Есть некоторое недопонимание, методы socket.io неблокирующие или блокирующие? Как распараллелить задачи на работу с клиентами и подзадачи клиентов? Или использовать Websocket?
примерно как должна выглядеть задача:
var io = require('socket.io');
io.sockets.on('connection', function (socket) {
socket.on('join', function (data) {
NewTask(data); =>Обработка данных, подключение к устройствам, получение ответа от устройств.
Отправляем клиенту, что задача выполнена
socket.emit('update', { data: 'Device is online' });
});
socket.on('disconnect', function () {
console.log('user disconnected');
});
});
|
CarterSS,
А какие действия происходят в обработчике события join? Есть ли там очень мощные вычисления, здоровенные циклы, и т.д.? Если да, то либо создавать дочерние процессы, либо разбивать на части и запускать через setTimeout, например. А если ничего такого нет, и в основном происходит чтение и запись данных, то используй неблокирующий ввод/вывод, и не заморачивайся. |
Событие join должно инициировать новые подключения к устройствам, пусть даже чтение и запись данных там будут синхронные. Но вот не знаю насколько зависнет работа с другими клиентами в этом случае. Здоровенных вычислений там не планируется.
|
Цитата:
|
Дык nodejs он вроде ж однопоточный, и распараллеливать процессы как в С нельзя. О чём написано, например, здесь
http://nodebeginner.ru Ну а дальше - берёте socket и добавляете его в stream. Операции с потоками неблокирующие, естессно. Иначе при тысячах клиентов прогер бы просто повесился, навешивая колбеки на все операции. streams.push(sock); //Добавляем в массив потоков Мой сервак так работает, никаких траблов не наблюдается. Операции с потоками в шите: https://nodejs.org/api/stream.html#s...itable_streams |
Цитата:
|
CarterSS
Сейчас главный вопрос чтобы эта подзадача не тормозила работу сокетов с клиентами, да и сам сокет должен быть неблокирующим. Так и не надо сидеть в обработчике события sock.on. Я сделал вот так:
socket.on('join', function (data) {
streams.push(sock); //Добавляем новый сокет в массив потоков
генерим событие ('обработать join' для streams.нашсокет) )
});
обработчик события 'join'
{
NewTask(data); =>Обработка данных
, подключение к устройствам, получение ответа от устройств.
// Отправляем клиенту, что задача выполнена
}
|
Цитата:
|
| Часовой пояс GMT +3, время: 17:28. |