Используйте Renjin в сервлете

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

Чтобы не тратить ресурсы на создание экземпляра renjin и загрузку одной и той же модели для каждого запроса, я рассматриваю возможность создания экземпляра renjin и загрузки модели один раз в одноэлементном объекте при запуске контейнера servet (в ServletContextListener).

Мой вопрос: является ли потокобезопасным для продолжения работы таким образом и как он работает с renjin, когда несколько запросов на предсказание выполняются одновременно (с использованием одной и той же модели, загруженной в одном и том же экземпляре)? Как правильно сделать это: я должен использовать блокировку на экземпляре renjin, чтобы сохранить его потокобезопасным? или создать пул потоков вместо?

1 ответ

Решение

Одна сессия Renjin не должна использоваться для одновременной оценки нескольких скриптов.

Тем не менее, вы можете поддерживать пул Renjin ScriptEngine объекты или использовать ThreadLocal просто поддерживать один на поток, как я сделал для примера RenjinServlet.

Синхронизация доступа к одному ScriptEngine Экземпляр также будет работать, если вы не ожидаете высокого уровня одновременных запросов.

Однако данные могут быть общими для сеансов, поэтому, если проблема с памятью, вы можете сначала загрузить модель из classpath или WEB-INF а затем поделиться с каждым из ScriptEngine экземпляров.

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