Сделать интенсивную функцию асинхронной - PullRequest
0 голосов
/ 12 июня 2018

Какой лучший способ заставить функцию, требующую больших затрат времени, такую ​​как манипулирование изображениями, запускаться асинхронно, чтобы позволить другому коду выполняться или разрешить параллельному запуску нескольких экземпляров указанной функции?(может быть привязано к конкретному узлу) Например, например fs.readFile () или fetch () (XHR).

1 Ответ

0 голосов
/ 12 июня 2018

Поскольку node.js запускает ваш Javascript как однопоточный (только один фрагмент Javascript, выполняемый за один раз), если ваши интенсивные вычисления на изображениях в настоящее время полностью исполняют код Javascript, тогда ваши варианты запуска ваших изображений параллельно с другимиJavascript:

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

  2. Написать надстройку нативного кода для node.js, которая использует нативные потоки и нативный кодчтобы манипулировать изображением , и это предлагает асинхронный интерфейс к коду node.js.Затем вы можете вызвать этот интерфейс асинхронно из node.js и получить уведомление, когда он будет завершен, но node.js будет свободен работать над другими вещами, пока он работает.

  3. Разбейте манипуляции с изображениями на очень маленькие рабочие фрагменты , так что вы можете выполнить небольшую часть работы (например, несколько мс), запланировать выполнение следующей части работы за несколько мс и вернуть управление обратно вПодсистема событий, чтобы она могла обрабатывать другие события, чередующиеся с вашими небольшими кусками работы.К вашему сведению, разработать сложный код для запуска небольшими порциями сложно.Вам в конечном итоге придется по сути построить конечный автомат, который может выполнять небольшой объем работы и возвращаться, только для того, чтобы позже вызвать его для выполнения дополнительной работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...