Является ли Socket.IO многопоточным?

У меня есть сервер socket.io, который слушает сокеты:

io.sockets.on('connection', function(socket){
    socket.on('myEvent', function(data){
        socket.emit('eventReceived', { status: 1 });
    });
});

Этот код работает в многопоточности? если два клиента будут генерировать событие myEvent, оно будет работать одновременно для обоих клиентов? или это будет обрабатываться один за другим?

Большое спасибо!


person udidu    schedule 30.04.2012    source источник
comment
Нет, это не многопоточность. Node.js использует однопоточный цикл обработки событий. См. этот ответ мой для дальнейшего объяснения.   -  person Linus Thiel    schedule 30.04.2012
comment
Если Node.js не является многопоточным, значит, Socket.IO также не является многопоточным?   -  person udidu    schedule 30.04.2012
comment
Точно. Вы можете масштабироваться, запустив распределенную серверную часть для обмена сообщениями, есть redis store.   -  person Linus Thiel    schedule 30.04.2012


Ответы (1)


Ничто в Node.js не является многопоточным, включая любые пакеты, доступные через npm. В ядре доступен экспериментальный кластерный модуль

http://nodejs.org/docs/v0.10.2/api/cluster.html

person deltanovember    schedule 30.04.2012
comment
Тот факт, что Node.js имеет один цикл событий, не означает, что асинхронные процессы под капотом, за кулисами, не являются многопоточными. Потому что многие. Вот одна статья, в которой рассматривается одна проблема в этом отношении: future-processing.pl/blog/on-problems-with-threads-in-node-js - person user1588877; 04.05.2017
comment
@deltanovember Node является однопоточным. Ссылка на эту статью вводит в заблуждение. Использование пула потоков не означает, что вы многопоточны, это просто означает, что вы планируете задачи. Многопоточность означает, что вы можете запускать несколько вещей одновременно (одновременно). Использование пула потоков означает, что ОС будет выполнять их наиболее эффективным способом, что означает, что он МОЖЕТ быть параллельным. Во всех случаях Node не имеет над ним никакого контроля. Асинхронный просто означает, что вы не ждете его завершения, прежде чем продолжить и, следовательно, не блокируете (например, промисы) - person Sinaesthetic; 14.08.2018
comment
Языки событий, поддерживающие многопоточность, делают это различие. Как и в C#, async/await и Thread — две совершенно разные вещи. - person Sinaesthetic; 14.08.2018
comment
libuv node.js также является многопоточным, поэтому Node.js является однопоточным, но это не означает, что каждая его библиотека является такой! так что может даже некоторых пакетов npm тоже не быть! - person Amir Hossein; 20.12.2020