@kinojs
Начинающий разрабочтик, WEB

Почему пишет ошибку Error: Module did not self-register при работе с worker threads (canvas)?

Ошибка появляется только, если я запрашиваю модуль canvas в дочернем Worker'е

Я пытался делать переустановку модулей, удалял папку node_modules, делал rebuild.
Все это не помогло

Nodejs последней версии, npm тоже
  • Вопрос задан
  • 1256 просмотров
Пригласить эксперта
Ответы на вопрос 2
Vlad_IT
@Vlad_IT Куратор тега JavaScript
Front-end разработчик
ой, сколько я с этой фигней намучился в электроне...
Особо ничего и не сделаешь, т.к. модули ноды не работают в многопотоке. Даже если у вас и получится заимпортить модуль, при асинхронном callback'е будет падать нода. У меня получалось импортить, но модуль можно импортить только в одном потоке (главный поток тоже считается). т.е. если вы заимпортили модуль в главном потоке приложения, или в другом worker'е, снова заимпортить вы его не сможете. Можно конечно создать для каждого worker'а отдельный скомпилированный файл, но это костыль.
Ответ написан
Комментировать
@lostero
Единственное решение - форкать и править под многопоточность биндинг.
Разработчики более 3 лет подобные issue закрывают, как невозможные.

Это косяк разработчиков нативного модуля.
Данные модуля должны быть привязаны к контексту, в котором они создаются (NodeJS Context-aware addon)
И должны очищаться, когда контекст уничтожается, через спец. хук ноды

Разработчики сего аддона либо не знают этого, либо забивают в пользу поддержки старых версий ноды.

worker_thread, child_process используют собственные экземпляры Ноды для каждого потока.
Если нативный модуль не может это использовать, то это проблема разработчика нативного модуля.
Я вот ни в зуб ногой в синтаксисе C/C++, но смог нативную либу для кодирования изображений в h264 заставить работать как надо и в нодовских потоках (8-50 микросекунд на один 1080p фрейм).

Моего терпения переписывать за другими биндинг ещё и для этого модуля не хватит, склонирую модуль или буду кидаться данными из отдельного процесса (если совсем убого по роизводительности придётся лезть в C/C++ и кривыми руками говнокодить модуль, чтобы был производительнее, т.к. гуру C/C++ в опенсорс редко лезут без спонсоров).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы