Как NodeJS использует epoll для реализации асинхронного? [Дубликат]

37
задан Joe 12 July 2013 в 05:04
поделиться

3 ответа

Javascript не компилируется ни во что. Он «оценивается» во время выполнения, точно так же, как PHP & amp; Рубин. Поэтому это скриптовый язык, как PHP / Ruby. (это официальное имя на самом деле является ECMAScript).

«Модель», которой придерживается Node, немного отличается от PHP / Ruby. Node.js использует «цикл событий» (единственный поток), который имеет одну цель - быстро принимать сетевые запросы и обрабатывать их, и по какой-либо причине он сталкивается с операцией, которая занимает некоторое время (запрос API, запрос базы данных - в основном что-либо, связанное с IO (ввод / вывод)), он передает это на фоновый «рабочий» поток и уходит, чтобы сделать что-то еще, пока рабочий поток ждет завершения длинной задачи. Когда это произойдет, основной «цикл событий» примет результаты и продолжит их решать.

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

Асинхронный означает безстоящий и что соединение является постоянным, а синхронным является (почти) противоположное.

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

Может ли JavaScript быть превращен в синхронный язык?

Некоторые операции в JavaScript синхронны. Другие асинхронны. Например:

Операции блокировки:

for(var k = 0; k < 1; k = k - 1;){
  alert('this will quickly get annoying and the loop will block execution')
alert('this is blocked and will never happen because the above loop is infinite');

Асинхронный:

jQuery.get('/foo', function (result) { alert('This will occur 2nd, asynchronously'); });
alert('This will occur 1st. The above operation was skipped over and execution continued until the above operation completes.');
25
ответ дан Bailey S 16 August 2018 в 11:35
поделиться
  • 1
    Почему нисходящий ответ на этот ответ, что неверно? – Casey Flynn 14 July 2013 в 00:31
  • 2
    Javascript не компилируется ни во что. неверно. Node.js использует V8, который включает компилятор JIT, который компилирует Javascript для машинного кода. Для PHP существует множество решений, которые могут скомпилировать код . Ruby не оценивает исходный код, а работает в абстрактном синтаксическом дереве. - & GT; Сам язык не означает, что он интерпретируется или компилируется, но конкретная реализация, о которой идет речь, не интерпретируется в классическом смысле. – flob 3 December 2014 в 12:45
  • 3
    @flob, он компилируется в байтовый код, а не в машинный код. – Fresheyeball 7 April 2015 в 16:36
  • 4
    @Fresheyeball & quot; V8 компилирует исходный код JavaScript непосредственно в машинный код при его первом выполнении. Нет промежуточных байтовых кодов, нет интерпретатора. & Quot; См. Документы по дизайну v8 - & gt; Генерация динамического машинного кода – flob 8 April 2015 в 10:00
  • 5
    @BaileyS Лучше подумать о скомпилированных и интерпретируемых реализациях, поскольку языки могут иметь несколько. Если кто-то пишет очень быстрый компилятор для PHP, язык все тот же. Поэтому я согласен с тем, что добавление нового компилятора не переклассифицирует язык, но не потому, что компиляторы JIT не являются настоящими компиляторами. – Mark 10 April 2017 в 06:33

Node.js работает на одном потоке, в то время как языки сценариев используют несколько потоков.

Не технически. Node.js использует несколько потоков, но только один поток выполнения. Фоновые потоки предназначены для работы с IO, чтобы сделать все асинхронное добро. Работа с потоками эффективно - это боль в королевстве, поэтому следующий лучший вариант - запустить в цикле событий, чтобы код мог работать, пока фоновые потоки блокируются в IO.

Асинхронный означает безстоящий и что соединение (синхронно) противоположно.

Не обязательно. Вы можете легко сохранить состояние в асинхронной системе. Например, в Javascript вы можете использовать bind() для привязки функции this к функции, тем самым сохраняя состояние явно при возврате функции:

function State() {
    // make sure that whenever doStuff is called it maintains its state
    this.doStuff = this.doStuff.bind(this);
}
State.prototype.doStuff = function () {
};

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

Мой второй и последний вопрос, связанный с этой темой это:

Может ли JavaScript быть превращен в синхронный язык?

Технически все языки синхронны, даже Javascript. Тем не менее, Javascript работает намного лучше в асинхронном дизайне, потому что он был спроектирован как однопоточный.

В основном существуют два типа программ:

  • CPU bound - единственный способ ускорить работу - увеличить время процессора
  • IO bound - тратит много времени на ожидание данных, поэтому более быстрый процессор не будет иметь значения

Видеоигры, числовые ключи и компиляторы связаны с ЦП, тогда как веб-серверы и графические интерфейсы обычно связаны с IO. Javascript относительно медленный (из-за того, насколько он сложный), поэтому он не сможет конкурировать в сценарии с привязкой к процессору (поверьте мне, я написал свою справедливую долю связанного с CPU Javascript).

Вместо кодирования в терминах классов и объектов Javascript поддается кодированию с точки зрения простых функций, которые можно объединить. Это очень хорошо работает в асинхронном дизайне, поскольку алгоритмы могут быть записаны для постепенного изменения данных процесса. IO (особенно сетевой IO) выполняется очень медленно, поэтому между пакетами данных существует довольно много времени.

Пример

Предположим, что у вас 1000 живых подключений, каждый из которых передает пакет каждые миллисекунды, а обработка каждого пакета занимает 1 микросекунду (очень разумно). Предположим также, что каждое соединение отправляет 5 пакетов.

В однопоточном синхронном приложении каждое соединение будет обрабатываться последовательно. Общее время (5 * 1 + 5 * .001) * 1000 миллисекунд или ~ 5005 миллисекунд.

В однопоточном асинхронном приложении каждое соединение будет обрабатываться параллельно. Поскольку каждый пакет занимает 1 миллисекунду, а обработка каждого пакета занимает 0,001 миллисекунды, мы можем обрабатывать пакет каждого соединения между пакетами, поэтому наша формула становится: 1000 * .001 + 5 * 1 миллисекунды или ~ 6 миллисекунд.

Традиционным решением этой проблемы было создание большего количества потоков. Это решило проблему ввода-вывода, но затем, когда число подключений увеличилось, так и использование памяти (потоки стоили большого объема памяти) и использование ЦП (мультиплексирование 100 потоков на 1 ядро ​​было сложнее, чем 1 поток на 1 ядре).

Однако есть недостатки. Если вашему веб-приложению также требуется сделать тяжелый хруст, вы являетесь SOL, потому что, когда вы хрустите цифры, соединения должны ждать. Threading решает это, потому что ОС может поменять вашу интенсивную CPU задачу, когда данные готовы к потоку, ожидающему ввода IO. Кроме того, node.js привязан к одному ядру, поэтому вы не можете воспользоваться своим многоядерным процессором, если не будете разворачивать несколько экземпляров и запросы прокси.

44
ответ дан tjameson 16 August 2018 в 11:35
поделиться

Может ли JavaScript быть превращен в синхронный язык?

Javascript не является «асинхронным языком»; скорее, node.js имеет много асинхронных API . Асинхронность - это свойство API, а не языка. Легкость, с которой функции могут быть созданы и переданы в javascript, позволяет удобно передавать функции обратного вызова, что является одним из способов обработки потока управления в асинхронном API, но нет ничего асинхронного в отношении javascript . Javascript может легко поддерживать синхронные API.

Почему node.js асинхронный?

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

13
ответ дан Trevor Dixon 16 August 2018 в 11:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: