2014-10-17 1 views
4

Я новичок в nodejs, в настоящее время изучаю его. Я знаю, что nodejs является однопоточным, однако мне интересно: если я использую неблокирующий метод, например, , есть 20000 одновременных запросов, и есть один запрос, требующий длительного времени, другие потоки занимают меньше времени. Итак, однажды мы встретились с более длинным запросом времени, nodejs скажет «привет, пожалуйста, пауза, другой запрос нужно использовать», есть ли время по умолчанию для nodejs, чтобы определить, нужно ли это приостановить? Исправьте меня, если я использую неправильное слово «puase» (потому что я думаю, что он является однопоточным, поэтому он должен прекратить вычислять один запрос, если другой запрос хочет быть обработанным.). В ситуации, которую я предположил, тогда более длинный запрос требует много времени, чтобы его можно было обработать?nodejs single thread? как это работает, если есть много параллельных запросов

Спасибо за помощь.

+0

Если долгое время имеет много синхронных вещей, да, у вас будет проблема, но если это асинхронно, например, чтение файла или запись файла, другие запросы будут продолжать обрабатываться, а ожидая завершения асинхронного действия. javascript запускается в цикле событий. Из-за этого вам следует избегать использования синхронных действий в приложении node.js, обслуживающем запросы. –

+0

@KevinB да, я понимаю, что другие будут обработаны, если я использую asynchonous. Но мой вопрос заключается в том, что, поскольку он является однопоточным, если вы обрабатываете другой запрос, требуется более короткое время, в течение этого времени более длительный запрос не обрабатывается в течение этого времени. Исправьте меня, если я ошибаюсь. Тогда есть много более короткого запроса времени, который приведет к тому, что запрос более длительного времени не будет прессованным. И нужно больше времени для завершения более длительного запроса. Это правильно? – adiggo

+1

Вот аналогия. Node.js - король. Он сидит на своем троне, и слуги приходят с просьбами о поиске ответов. Король слышит только один запрос за раз, и только один раз реагирует один раз. Тем не менее, у него много слуг, чтобы выполнять свою работу. Слуга А приходит немедленно, а затем слуга Б. Король слушает слугу А, а затем отправляет его, чтобы получить кофе. Затем он слушает слугу B и отправляет его, чтобы открыть окно. Если слуга Б возвращается к слуге А, слуга В будет уволен первым, а король все еще ждет слугу А. Когда слуга А вернется, король уволит его. 2. –

ответ

7

Верно, что node.js может получать или отвечать только на один запрос за раз, однако он может обрабатывать несколько запросов одновременно.

Например, предположим, что у вас есть приложение node.js, которое является априором отдыха, и каждый запрос приводит к вызову базы данных, за исключением конечной точки C. Остальная часть api имеет 3 конечных точки.

Конечная точка A: занимает 3 секунды, чтобы поговорить с базой данных

Endpoint B: занимает 2 секунды, чтобы поговорить с базой данных

Endpoint C: не разговаривает с базой данных, он просто возвращает статический текст.

Невозможно выполнить более одного запроса одновременно. Первый всегда первый, независимо от того, насколько близки временные метки.

Теперь, позволяет сказать, что у нас есть 10 запросов, происходящих в то же время, в следующем порядке:

ABCBCCAABC

Вот как они будут получены и ответил на:

REC:A 
REC:B 
REC:C 
RESP:C 
REC:B 
REC:C 
RESP:C 
REC:C 
RESP:C 
REC:A 
REC:A 
REC:B 
REC:C 
RESP:C 
// 2 seconds later 
RESP:B 
RESP:B 
RESP:B 
// 1 second later 
RESP:A 
RESP:A 
RESP:A 

C всегда происходит сразу, потому что он не выполняет никаких асинхронных действий. Затем вы получаете все B, а затем все из A, потому что B быстрее, чем A.

Порядок B и A может отличаться в зависимости от настройки базы данных, например, если он настроен только на обработку x запросов на время.

Если мы ввели и конечную точку D, которая выполняет синхронное действие, которое занимает 6 секунд, вы получите этот результат:

ADABC

REQ:A 
REQ:D 
// 6 long seconds later... 
RESP:D 
REQ:A 
REQ:B 
REQ:C 
RESP:C 
// 2 seconds later... 
RESP:B 
// 1 second later... 
RESP:A 
RESP:A 

потому, что D останавливает всю обработку яваскрипта в то время как это синхронное действие происходит место. 1 конечная точка, которая выполняет синхронное действие, является легкой точкой отказа для того, чтобы кто-то остановил ваш api.

+0

+1 приятный, легкий для переваривания ответ! –

+0

Отлично. Понимаю. Но у меня есть вопрос. В чем преимущество над другим языком «использовать новый поток после появления нового запроса». Я вижу, что разница в части ввода-вывода. Но в чем преимущество – adiggo

+0

Что я не думаю, что могу ответить, и я сомневаюсь, что это «разрезанный и сухой» ответ, так как каждый метод имеет свои собственные преимущества/недостатки. –