Аналог многопоточности и 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, время: 16:19. |