Я создаю фреймворк на Java, который будет прослушивать события, а затем обрабатывать их в Jython. Различные типы событий будут отправлены в разные сценарии.
Поскольку для компиляции скрипта jython требуется некоторое время, когда вызывается PythonInterpreter.exec (), мне придется предварительно скомпилировать скрипты. Я делаю это следующим образом:
// initialize the script as string (would load it from file in final version)
String script = "print 'foo'";
// get the compiled code object
PyCode compiled = org.python.core.__builtin__.compile( script, "<>", "exec" );
Скомпилированный объект PyCode будет помещен в репозиторий и использован по мере поступления событий
PythonInterpreter pi = new PythonInterpreter();
pi.set( "variable_1", "value_1");
pi.set( "variable_x", "value_x");
pi.exec( compiled );
Теперь для моей загадки - может случиться так, что одновременно происходит несколько событий определенного типа - таким образом, несколько экземпляров скрипта выполняются одновременно.
Почти все сценарии, вероятно, останутся недолговечными - до 100 строк, без циклов. Число и частота абсолютно случайны (генерируемые пользователем события) и могут составлять от 0 до 200 в секунду для каждого типа события.
Каким будет лучший способ сделать это? Я смотрю на несколько возможностей:
- использовать синхронизацию в точке события триггера - это предотвратит несколько экземпляров одного и того же сценария, но также события не будут обрабатываться так быстро, как должно быть
- создать пул сценариев того же типа, каким-то образом заполненным путем клонирования исходного объекта PyCode - самой большой проблемой, вероятно, будет оптимизация размеров пула
- динамически клонировать объект сценария от родительского объекта при необходимости, а затем отбрасывать его по завершении exec () - таким образом, отставание удаляется из компиляции, но оно все еще присутствует в методе клонирования
Вероятно, наилучшим будет сочетание чисел 2 и 3 - создание динамических размеров пула?
Итак, есть мысли? ;)