#javascript #html #multithreading #ecmascript-6 #web-worker
#javascript #HTML #многопоточность #ecmascript-6 #веб-рабочий
Вопрос:
Я пытаюсь реализовать очередь заданий с помощью web workers. Задача — декодирование изображения. Задачи будут поступать с высокой скоростью и занимать небольшое количество времени.
Я написал простую очередь, создающую 4 рабочих и обрабатывающих задания, которая работает хорошо. Однако на iPad мой код через некоторое время завершает работу страницы.
После долгих исследований я обнаружил, что по какой-то причине браузеры iPad неправильно / эффективно используют рабочую память GC, и при очень большом объеме заданий происходит сбой. (Другим объяснением может быть то, что код в потоке (декодирование jpeg) пропускает память, хотя я не могу найти его в профилировщике, и страница никогда не вылетает на других рабочих столах / устройствах).
Я обнаружил, что если я завершаю () каждого работника после завершения задания и создаю новое, на iPad все работает нормально. Итак, теперь я пытаюсь создать очередь заданий, которая порождает нового работника для каждого задания.
Проблема, с которой я сталкиваюсь, заключается в том, что создание рабочего является относительно дорогостоящим (~ 40 мс) и в конечном итоге будет конкурировать с потоком поступающих заданий в основном потоке. Мой вопрос в том, каков наилучший способ решить эту проблему и существуют ли какие-либо соответствующие существующие библиотеки решений? должен ли я переместить диспетчер очередей в собственный webworker? или, может быть, начать с maxWorkers * 2, и всякий раз, когда рабочий заканчивается, он сам порождает своего сменного работника и отправляет его менеджеру queque вместе с результатом?
Любые идеи приветствуются, спасибо.
Комментарии:
1. Внутри ваших рабочих вы можете очень незначительно повлиять на GC, установив для ваших неиспользуемых (больших) объектов значение NULL. Попробуйте это перед опцией уничтожения / возрождения.
2. спасибо, Рэнди, я попробовал это, iPad все еще вылетает .. это очень сложная проблема для отладки, так как страница просто перезагружается: (Я до сих пор не до конца понимаю это
3. Что
navigator.hardwareConcurrency
выводит на вашем устройстве? Для лучшей производительности вы не должны запускать это число — 1 рабочих одновременно. Но не уверен, что сбой связан. Где хранятся данные, которые будут декодироваться в каждой задаче? Как результат передается обратно в основной поток? В целом, я думаю, это помогло бы увидеть ваш фактический код или, по крайней мере, его минимальную версию.