Может ли один экземпляр скриптового движка renjin R использоваться несколькими потоками параллельно

#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. Еще раз спасибо за ваше объяснение 🙂