#java #renjin
#java #renjin
Вопрос:
Как новичок в использовании библиотеки renjin Java, я планирую использовать renjin ScriptEngine для параллельного выполнения вычислений в нескольких потоках. Очевидно, что хорошо инициализировать экземпляр renjin ScriptEngine в каждом потоке, а затем инициализированный экземпляр renjin может использоваться принадлежащим ему потоком.
Однако, поскольку инициализация одного экземпляра renjin занимает довольно много времени, у меня возник вопрос: могут ли несколько потоков совместно использовать один экземпляр enjin ScriptEngine и вызывать его параллельно?
Ответ №1:
Вы не можете безопасно оценивать несколько R-выражений одновременно, используя общую RenjinSession. Технически вы могли бы, если бы убедились, что ни одна из вызываемых вами функций R не влияет на состояние уровня сеанса, которое включает:
- Изменение глобальной среды R
- Генерация случайных чисел
- Параметры обновления ()
- Запуск оценки общих, недооцененных обещаний
Но все эти вещи довольно распространены среди функций R в пакетах base и stats.
Если вы хотите уменьшить накладные расходы на инициализацию новых повторных сеансов, рассмотрите возможность использования ThreadLocal для кэширования одного сеанса на поток или используйте что-то вроде библиотеки пула Apache Commons для поддержания пула инициализированных сеансов, которые могут быть быстро получены новыми потоками.
Комментарии:
1. Сначала большое спасибо за ваш ответ 🙂 Во-первых, я бы сказал, что моя проблема не связана со случайными числами, что касается других упомянутых случаев, я на самом деле понятия не имею, связано ли мое вычисление с использованием renjin или нет. Но я могу сказать, что мой расчет прост. Это связано только с базовыми арифметическими вычислениями, то есть сложением, вычитанием, умножением, делением и экспоненциальным, а также вычислением, выполняемым с различным назначением некоторых переменных. Например,
a=0; b=0; a b
,a:1;b=1; a b
Так что в этом случае я могу разделить один скрипт renjin ScriptEngine между разными потоками?2. Ну, вы также можете попробовать это и написать для него тесты, которые проверяют правильность в условиях высокого параллелизма, но ошибки параллелизма могут быть трудно обнаружить…
3. Еще раз спасибо за подсказку 🙂 кстати, вы имеете в виду, что у одного скриптового движка не может быть нескольких сеансов?
4. Нет, 1 ScriptEngine == 1 сеанс. вы можете создать несколько экземпляров скриптов для каждой виртуальной машины,
5. Еще раз спасибо за ваше объяснение 🙂