Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 02.03.2017, 21:45
Интересующийся
Отправить личное сообщение для CarterSS Посмотреть профиль Найти все сообщения от CarterSS
 
Регистрация: 07.12.2016
Сообщений: 10

Аналог многопоточности и 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, 02.03.2017 в 22:01.
Ответить с цитированием
  #2 (permalink)  
Старый 03.03.2017, 00:37
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

CarterSS,
А какие действия происходят в обработчике события join? Есть ли там очень мощные вычисления, здоровенные циклы, и т.д.? Если да, то либо создавать дочерние процессы, либо разбивать на части и запускать через setTimeout, например.
А если ничего такого нет, и в основном происходит чтение и запись данных, то используй неблокирующий ввод/вывод, и не заморачивайся.
Ответить с цитированием
  #3 (permalink)  
Старый 03.03.2017, 10:17
Интересующийся
Отправить личное сообщение для CarterSS Посмотреть профиль Найти все сообщения от CarterSS
 
Регистрация: 07.12.2016
Сообщений: 10

Событие join должно инициировать новые подключения к устройствам, пусть даже чтение и запись данных там будут синхронные. Но вот не знаю насколько зависнет работа с другими клиентами в этом случае. Здоровенных вычислений там не планируется.
Ответить с цитированием
  #4 (permalink)  
Старый 03.03.2017, 10:26
Интересующийся
Отправить личное сообщение для CarterSS Посмотреть профиль Найти все сообщения от CarterSS
 
Регистрация: 07.12.2016
Сообщений: 10

Сообщение от Rise Посмотреть сообщение
Что за устройства это всё не для браузеров нужно?
Работы с браузерами нет. Сервер должен собирать данные с устройств по TCP.
Ответить с цитированием
  #5 (permalink)  
Старый 03.03.2017, 10:57
Аспирант
Отправить личное сообщение для -VenoM- Посмотреть профиль Найти все сообщения от -VenoM-
 
Регистрация: 31.10.2016
Сообщений: 44

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

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


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

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

https://nodejs.org/api/stream.html#s...itable_streams
Ответить с цитированием
  #6 (permalink)  
Старый 03.03.2017, 11:59
Интересующийся
Отправить личное сообщение для CarterSS Посмотреть профиль Найти все сообщения от CarterSS
 
Регистрация: 07.12.2016
Сообщений: 10

Сообщение от Rise
таки работай непосредственно по TCP смотри Net.
Я понял. Сейчас главный вопрос чтобы эта подзадача не тормозила работу сокетов с клиентами, да и сам сокет должен быть неблокирующим.
Ответить с цитированием
  #7 (permalink)  
Старый 03.03.2017, 13:25
Аспирант
Отправить личное сообщение для -VenoM- Посмотреть профиль Найти все сообщения от -VenoM-
 
Регистрация: 31.10.2016
Сообщений: 44

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

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

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


обработчик события 'join'
{
NewTask(data); =>Обработка данных
, подключение к устройствам, получение ответа от устройств.
//                Отправляем клиенту, что задача выполнена
}
Ответить с цитированием
  #8 (permalink)  
Старый 03.03.2017, 16:39
Интересующийся
Отправить личное сообщение для CarterSS Посмотреть профиль Найти все сообщения от CarterSS
 
Регистрация: 07.12.2016
Сообщений: 10

Сообщение от -VenoM-
Так и не надо сидеть в обработчике события sock.on.
Я сделал вот так:
Благодарствую за направление, буду разбираться.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Socket.IO, общий транспорт для нескольких вкладок Котзилла AJAX и COMET 2 20.04.2015 02:26
Онлайн игра на Node.js + SockJS или socket.io freerunner AJAX и COMET 4 19.04.2014 18:46
аналог ajaxupload на чистом js Гугл-мен Общие вопросы Javascript 1 04.11.2013 13:49
Аналог цитата выделеного Гугл-мен Общие вопросы Javascript 4 20.07.2013 14:23
аналог getElementsByName MaxB jQuery 2 04.08.2009 19:39