Совместно использовать неизменный объект / функцию в многопоточной среде (встроенный v8)

N00b вопрос. Я думаю о встраивании v8/SpiderMonkey в код моего сервера. Сервер принимает тысячи запросов в секунду. Так что многопоточность обязательна. Мне просто интересно, могут ли разные потоки делиться скомпилированными неизменяемыми функциями и объектами js? Поэтому мне не нужно повторно и снова инициализировать их при запуске нового потока. Спасибо!

1 ответ

Изоляты V8 являются однопоточными (только один поток может быть введен в изолят за раз и получить доступ к его куче / выполнить его код), таким образом, "создание нового потока" означает создание нового изолята, что очень тяжело для сделайте так, что вы определенно не сможете сделать это в ответ на запрос в любом случае.

Вы можете создать множество изоляторов v8 и запускать их в своих собственных потоках параллельно, но все они будут изолированным экземпляром js-runtime. Ничто в их js-кучах не может быть совместно использовано, хотя они, конечно, могут совместно использовать тот же объект C, для которого у них есть своя тонкая копия JS-оболочки.

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

Другие вопросы по тегам