Вы можете получить одну и ту же метку времени на 2 одновременных звонках. Но не потому, что NodeJS или ваш сервер обслуживал запрос параллельно, а потому, что миллисекунда - это достаточно длительное время, чтобы ваш сервер мог обрабатывать много запросов за одну и ту же миллисекунду.
Многопоточный или Параллельный
Вы правильно определили тонкое, но важное различие между параллелизмом и многопоточностью. В многопоточной среде две разные операции могут действительно выполняться одновременно на двух разных ядрах ЦП. В параллельной, но однопоточной среде все происходит последовательно, надеюсь, неблокирующим образом и действительно быстро!
Javascript - это однопоточная среда. И да, у него есть цикл обработки событий, в котором он ставит задачи в очередь и обрабатывает их по одной за раз. NodeJS (и веб-API в случае браузерных приложений Javascript) предлагают определенные асинхронные функции, такие как fs.writeFile
или fetch
, которые среда выполнения в сотрудничестве с ОС может выполнять в том же или другом потоке / ядре, а затем организовывать возврат результаты обратно в ваше приложение через обратные вызовы и обещания.
В вашем примере ваш обработчик (часть, начинающаяся с (req, res) => { ... }
) состоит только из вызовов синхронизации. Так что, да, различные вызовы этого обработчика будут выполняться последовательно, один за другим. И хотя никакие два запуска этого обработчика действительно никогда не произойдут в одно и то же время , но они будут происходить очень быстро, и у вас, скорее всего, будут случаи, когда вы получите одно и то же значение в миллисекундах от объекта Date. Если у вас была доступная временная метка с более высоким разрешением (возможно, нано секунд) или если вашему обработчику потребовалось больше времени (например, вы запустили цикл for
на миллиард итераций), тогда вы сможете более четко наблюдать за последовательным поведением .
Избегать блокирования (синхронизации) вызовов в однопоточных приложениях
Именно по этой причине вам не рекомендуется выполнять какие-либо операции синхронного ввода-вывода (например, fs.writeFileSync
и т. Д.) На веб-сервере NodeJS, поскольку, пока один запрос выполняет блокирующую операцию ввода-вывода, все остальные запросы ожидают, поставлен в очередь в цикле событий.
Действительно хорошее видео о цикле событий Javascript; это должно осветить некоторые темы: https://www.youtube.com/watch?v=8aGhZQkoFbQ