2016-04-08 2 views
1

Я ознакомился с некоторыми вводными статьями в Node.js и Event Loop, и одна вещь не ясна - если есть несколько одновременных запросов, то ответы всегда последовательны в том порядке, в котором был сделан запрос? Скажите, было ли выполнено 20 запросов одновременно, а затем 20-й ответ должен был ждать, пока другие 19 будут очищены (ответьте клиенту)?Порядок отклика в Node.js?

Обновление: Мне было интересно, похоже ли это на то, как несколько setTimeouts попадают в очередь?

ответ

3

node.js работает Javascript как один threaded. Таким образом, только один кусок Javascript работает в любой момент времени.

Но почти все операции ввода/вывода (например, сеть, доступ к файлам и т. Д.) Являются асинхронными и неблокирующими. Итак, если за ваш короткий промежуток времени будет выполнено 20 запросов на ваш сервер, первый запрос на получение сервера начнет выполнять его обработчик запросов, а остальные запросы будут поставлены в очередь. Но, как только первый запрос попадает в асинхронную операцию (например, чтение из локальной файловой системы), этот запрос будет приостановлен, когда происходит неблокирующий асинхронный ввод-вывод, и следующий запрос в строке начнет работать ,

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

Различные запросы будут продолжаться до тех пор, пока все не будут выполнены. Несколько запросов могут быть «в полете» одновременно (это значит, что они были запущены, но еще не завершены), но только один из них действительно выполняет код в любой момент.

Это иногда называют совместными задачами. Между различными запросами нет предустановленных многозадачных задач, каждый из которых автоматически получает временной срез центрального процессора. Но каждый раз, когда запрос попадает в асинхронную операцию ввода-вывода, он сообщает планировщику, что могут запускаться другие запросы, ожидающие запуска.

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

Преимущества этого типа системы являются:

  1. Это весы очень хорошо, особенно для ввода/вывода связанных операций сервера, потому что вы можете иметь много запросов «в полете» в то же время с только один поток Javascript. Совместная задача очень легкая и быстрая.

  2. Программирование такой системы имеет гораздо меньше «условий гонки», чтобы следить, потому что ни один из двух частей Javascript не работает в то же время. Это означает, что вы часто можете делиться состоянием между запросами, не имея при этом необходимости использовать мьютексы (например, в многопоточной среде). Поскольку потокобезопасные ошибки часто очень трудно избежать и проверять, это важное преимущество для устранения этих типов ошибок.

  3. Совместная модель концептуально проста и понятна и безопасна для программирования.

К недостаткам этого типа системы являются:

  1. Он не разделяет CPU среди задач, которые CPU-оценка. Программист node.js с множеством тяжелых вычислений с привязкой к процессору часто должен использовать кластерные или дочерние процессы для обработки вычислений CPU heave, чтобы не перегружать основную обработку запросов Javascript этой работой и сделать ее слишком невосприимчивой ,

  2. Для максимального использования нескольких процессоров требуется кластеризация процессов, а затем любые общие данные должны быть разделены между этими процессами. Люди часто используют базу данных в памяти, такую ​​как Redis, для обмена данными между процессами.

  3. Вы не можете просто волей-неволей запускать еще одну тему Javascript, чтобы уйти и что-то сделать.

+0

Удивительный ответ. Не могли бы вы немного подробнее рассказать о процессах, которые рассматриваются как асинхронные, и тех, кто не рассматривается как асинхронный. –

+0

@GandalftheWhite - В node.js практически любая функция библиотеки, которая обеспечивает результат в функции обратного вызова, является асинхронной. Например, ['fs.readFile()'] (https://nodejs.org/api/fs.html#fs_fs_readfile_file_options_callback) является асинхронным. ['fs.readFileSync()'] (https://nodejs.org/api/fs.html#fs_fs_readfilesync_file_options) является синхронным. Обычно это будет очевидно на основе интерфейса или документации функции, но это то, что вы должны знать, чтобы правильно использовать функцию. – jfriend00

+0

@GandalftheWhite. Асинхронные операции должны быть основаны на базовой операции, выполняемой асинхронной в собственном коде, поскольку вы не можете записать истинную асинхронную операцию с нуля в node.js. Вы должны либо основать его на существующих асинхронных операциях, либо создать собственный плагин кода, который выполняет операцию асинхронно, а затем вызывает обратный вызов позже с результатами. – jfriend00

Смежные вопросы