Код отвечает в JavaScript для огромных вычислений - PullRequest
0 голосов
/ 05 января 2019

Цитата из книги "Понимание ECMASCript 6":

Движки JavaScript построены на концепции однопоточного цикла обработки событий. Однопоточный означает, что одновременно выполняется только один фрагмент кода.
...
Механизмы JavaScript могут выполнять только один фрагмент кода за раз, поэтому им нужно следить за кодом, который предназначен для запуска. Этот код держать в очереди на работу. Всякий раз, когда кусок кода готов к выполнению, он добавляется в очередь заданий. Когда движок JavaScript закончен выполняя код, цикл обработки выполняет следующее задание в очереди. цикл обработки событий - это процесс внутри механизма JavaScript, который отслеживает выполнение кода и управление очередью заданий. Имейте в виду, что как очередь, выполнение задания выполняется от первого задания в очереди до последнего.

Означает ли это, что если следующий фрагмент кода в очереди заданий займет много времени, веб-приложение не будет отвечать до тех пор, пока код не будет завершен? Каков размер «куска кода»? Это тело функции или блок кода (то есть код внутри {} скобок)? Тело функции содержит вызов другой функции (это кроличья нора ...). Это меня смущает.

Например, это может быть огромный код функции, который используется при инициализации экземпляра Promise, или огромный код в .then((resolve,reject)=> {...}:

// ...
const p = new Promise((resolve, reject) => {
    // Here is long work
    // ...
});

// ...

p.then(() => {
    // Or long work is here
    // ...
});

Ответы [ 3 ]

0 голосов
/ 05 января 2019

Означает ли это, что следующий фрагмент кода в очереди заданий занимает много времени? время веб-приложение не будет отвечать, пока код не будет закончил

В основном да, сложность времени имеет большое значение, когда вы запускаете код в цикле событий. Например, в nodejs не рекомендуется использовать синхронную версию API шифрования, т.е.:

  • crypto.randomBytes (synchronous version)
  • crypto.randomFillSync
  • crypto.pbkdf2Sync

, поскольку они требуют дорогостоящих вычислений.

Каков размер "куска кода"? Это тело функции или блок кода (т.е. код внутри {} скобок)?

Из вашей цитаты, «кусок кода», я думаю, что это просто ссылка на оператор, поэтому один поток может выполнять только ОДИН оператор за раз, поэтому параллельного выполнения не происходит, чего можно достичь только с несколькими потоками. ,

Примечание: вместо "размера фрагмента кода" важнее вычислительная сложность . Довольно большой «размер фрагмента кода» может выполняться за постоянное время O (1), тогда как фрагмент меньшего размера может занимать экспоненциальное время.

Подробнее здесь , особенно для Google V8 Engine.

TL; DR : сложность вычислений имеет значение, особенно в однопоточных двигателях. Для длительных вычислений используйте веб-работников в браузере или дочерний процесс при использовании узла.

0 голосов
/ 05 января 2019

Режим параллелизма и javascript_eventloops

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

Перейти по этой теме: Выполнить до завершения

Надеюсь, что это отвечает на ваш вопрос ..

0 голосов
/ 05 января 2019

вы можете установитьInterval для каждой функции, чтобы сократить время выполнения скрипта.

...