Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Аналог многопоточности и socket.io (https://javascript.ru/forum/node-js-io-js/67687-analog-mnogopotochnosti-i-socket-io.html)

CarterSS 02.03.2017 21:45

Аналог многопоточности и 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');
	});
});

Alexandroppolus 03.03.2017 00:37

CarterSS,
А какие действия происходят в обработчике события join? Есть ли там очень мощные вычисления, здоровенные циклы, и т.д.? Если да, то либо создавать дочерние процессы, либо разбивать на части и запускать через setTimeout, например.
А если ничего такого нет, и в основном происходит чтение и запись данных, то используй неблокирующий ввод/вывод, и не заморачивайся.

CarterSS 03.03.2017 10:17

Событие join должно инициировать новые подключения к устройствам, пусть даже чтение и запись данных там будут синхронные. Но вот не знаю насколько зависнет работа с другими клиентами в этом случае. Здоровенных вычислений там не планируется.

Rise 03.03.2017 10:17

Цитата:

Сообщение от CarterSS (Сообщение 446157)
Или использовать Websocket?

Почитай что есть что differences between socket.io and websockets. Что за устройства это всё не для браузеров нужно?

CarterSS 03.03.2017 10:26

Цитата:

Сообщение от Rise (Сообщение 446200)
Что за устройства это всё не для браузеров нужно?

Работы с браузерами нет. Сервер должен собирать данные с устройств по TCP.

-VenoM- 03.03.2017 10:57

Дык nodejs он вроде ж однопоточный, и распараллеливать процессы как в С нельзя. О чём написано, например, здесь
http://nodebeginner.ru
Ну а дальше - берёте socket и добавляете его в stream.

Операции с потоками неблокирующие, естессно. Иначе при тысячах клиентов прогер бы просто повесился, навешивая колбеки на все операции.
streams.push(sock);      //Добавляем в массив потоков


Мой сервак так работает, никаких траблов не наблюдается.

Операции с потоками в шите:

https://nodejs.org/api/stream.html#s...itable_streams

Rise 03.03.2017 11:37

CarterSS, таки работай непосредственно по TCP смотри Net.

CarterSS 03.03.2017 11:59

Цитата:

Сообщение от Rise
таки работай непосредственно по TCP смотри Net.

Я понял. Сейчас главный вопрос чтобы эта подзадача не тормозила работу сокетов с клиентами, да и сам сокет должен быть неблокирующим.

-VenoM- 03.03.2017 13:25

CarterSS
Сейчас главный вопрос чтобы эта подзадача не тормозила работу сокетов с клиентами, да и сам сокет должен быть неблокирующим.

Так и не надо сидеть в обработчике события sock.on.
Я сделал вот так:
socket.on('join', function (data) {    
 streams.push(sock);      //Добавляем новый сокет в массив потоков
                

генерим событие ('обработать join' для streams.нашсокет) )
    });


обработчик события 'join'
{
NewTask(data); =>Обработка данных
, подключение к устройствам, получение ответа от устройств.
//                Отправляем клиенту, что задача выполнена
}

CarterSS 03.03.2017 16:39

Цитата:

Сообщение от -VenoM-
Так и не надо сидеть в обработчике события sock.on.
Я сделал вот так:

Благодарствую за направление, буду разбираться.


Часовой пояс GMT +3, время: 05:12.