Используйте Renjin в сервлете
Я обучил модель на R и хочу вычислять предсказания в сервлете, используя renjin. Прогнозы всегда используют одну и ту же уникальную модель.
Чтобы не тратить ресурсы на создание экземпляра renjin и загрузку одной и той же модели для каждого запроса, я рассматриваю возможность создания экземпляра renjin и загрузки модели один раз в одноэлементном объекте при запуске контейнера servet (в ServletContextListener).
Мой вопрос: является ли потокобезопасным для продолжения работы таким образом и как он работает с renjin, когда несколько запросов на предсказание выполняются одновременно (с использованием одной и той же модели, загруженной в одном и том же экземпляре)? Как правильно сделать это: я должен использовать блокировку на экземпляре renjin, чтобы сохранить его потокобезопасным? или создать пул потоков вместо?
1 ответ
Одна сессия Renjin не должна использоваться для одновременной оценки нескольких скриптов.
Тем не менее, вы можете поддерживать пул Renjin ScriptEngine
объекты или использовать ThreadLocal
просто поддерживать один на поток, как я сделал для примера RenjinServlet.
Синхронизация доступа к одному ScriptEngine
Экземпляр также будет работать, если вы не ожидаете высокого уровня одновременных запросов.
Однако данные могут быть общими для сеансов, поэтому, если проблема с памятью, вы можете сначала загрузить модель из classpath или WEB-INF
а затем поделиться с каждым из ScriptEngine
экземпляров.