многопоточность — нодальные модули JS: можете ли вы запускать методы C / C ++ в отдельном процессе в стиле Libuv / NodeJS?

Немного странно это …

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

Грубо говоря, модуль открывает сервер ввода-вывода, но есть ошибка, из-за которой мне приходится открывать и закрывать сервер ввода-вывода для получения определенного значения … Когда я выполняю это действие, любые указатели, найденные для ссылки на старый объект сервера ввода-вывода, очевидно, ломаются / segfault (ошибка «пространства каракулей», верно?).

Чтобы обойти эту проблему, я в настоящее время использую NodeJS child_process.fork () для запуска ошибочного метода в изолированном контексте и передачи сообщений между основным процессом и разветвленным процессом, чтобы программа работала как требуется (то есть я вызываю метод внутри разветвленный процесс и используйте process.on («message», …) для получения результата). Это хорошо работает, но похоже на очень дорогой взлом …

Для записи я попытался использовать поток Libuv для запуска метода, но столкнулся с той же проблемой. Я предполагаю, что это потому, что вызов функции все еще выполняется в общей памяти.

Могу ли я в любом случае запустить небольшую часть (или больше …) кода C / C ++ в процессе «стиля NodeJS» с использованием C ++?

1

Решение

Вы не можете оторвать один метод чисто в новый процесс. Вероятно, вам следует написать немного клея на C ++ в качестве модуля узла и запустить отдельный процесс в качестве сервера. Затем вы можете общаться с этим процессом через сокеты (или сокеты unix, или все, что работает в вашей целевой ОС).

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

Написание расширений C ++ для узла довольно просто — я опытный программист C ++, плохо знакомый с javascript, и я начал это делать совсем недавно. Несколько советов там …

  1. Используйте NaN (родные абстракции для Node) https://github.com/rvagg/nan защитить вас от изменений в миграции 0.10 -> 0.11 -> 0.12

  2. Проработайте учебник ( http://nodejs.org/api/addons.html ) «трудный путь», то есть ввод каждого примера и его построение.

  3. Используйте библиотеку модульных тестов C ++

Пример проекта, который я готовлю (но он уже работает достаточно хорошо), можно найти здесь: https://github.com/smikes/inchi InChI является стандартом для представления молекул; это делает библиотеку C / C ++ InChI пригодной для использования с узла.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]