Немного странно это …
Я написал собственный модуль NodeJS, который хорошо работает большую часть времени, но класс содержит метод, который прерывает модуль, когда он запускается в контексте, который разделяет память.
Грубо говоря, модуль открывает сервер ввода-вывода, но есть ошибка, из-за которой мне приходится открывать и закрывать сервер ввода-вывода для получения определенного значения … Когда я выполняю это действие, любые указатели, найденные для ссылки на старый объект сервера ввода-вывода, очевидно, ломаются / segfault (ошибка «пространства каракулей», верно?).
Чтобы обойти эту проблему, я в настоящее время использую NodeJS child_process.fork () для запуска ошибочного метода в изолированном контексте и передачи сообщений между основным процессом и разветвленным процессом, чтобы программа работала как требуется (то есть я вызываю метод внутри разветвленный процесс и используйте process.on («message», …) для получения результата). Это хорошо работает, но похоже на очень дорогой взлом …
Для записи я попытался использовать поток Libuv для запуска метода, но столкнулся с той же проблемой. Я предполагаю, что это потому, что вызов функции все еще выполняется в общей памяти.
Могу ли я в любом случае запустить небольшую часть (или больше …) кода C / C ++ в процессе «стиля NodeJS» с использованием C ++?
Вы не можете оторвать один метод чисто в новый процесс. Вероятно, вам следует написать немного клея на C ++ в качестве модуля узла и запустить отдельный процесс в качестве сервера. Затем вы можете общаться с этим процессом через сокеты (или сокеты unix, или все, что работает в вашей целевой ОС).
Если вы действительно сталкиваетесь с ошибками повреждения памяти, вам нужно будет изолировать плохой код в отдельный процесс, чтобы при его выходе не происходил процесс основного узла — только крошечный сервер, который поддерживает то, что вам нужно.
Написание расширений C ++ для узла довольно просто — я опытный программист C ++, плохо знакомый с javascript, и я начал это делать совсем недавно. Несколько советов там …
Используйте NaN (родные абстракции для Node) https://github.com/rvagg/nan защитить вас от изменений в миграции 0.10 -> 0.11 -> 0.12
Проработайте учебник ( http://nodejs.org/api/addons.html ) «трудный путь», то есть ввод каждого примера и его построение.
Используйте библиотеку модульных тестов C ++
Пример проекта, который я готовлю (но он уже работает достаточно хорошо), можно найти здесь: https://github.com/smikes/inchi InChI является стандартом для представления молекул; это делает библиотеку C / C ++ InChI пригодной для использования с узла.
Других решений пока нет …