Кто-нибудь успешно запустил IronPython без проблем в веб-среде? Я сталкиваюсь с некоторыми проблемами.
Первая проблема: на самом деле я не запускаю никаких специфичных для IronPython сценариев, я реализую библиотеку Pygments , чтобы можно было получать подсветку синтаксиса на стороне сервера. В библиотеке около 20+ файлов.
Помимо того, что последний выпуск IronPython не может скомпилировать сценарии в DLL (из-за этой проблемы ), он успешно работает, просто копируя все файлы и зависимости в папку bin.
Проблема в том, что я пошел посмотреть, как работает мой процесс w3wp.exe при выделении, и заметил некоторые проблемы с showtopper:
Даже на полностью простом, пустом веб-сайте под Cassini выделение кода select * from table
с использованием лексера SQL вызывает скачок 10 МБ каждый раз, когда я его выполняю (обновление страницы) ... Я явно отключаю двигатель и использование LightweightScopes
в одном вызове функции. Он начинается с 30 МБ и примерно с 20 обновлениями - с 150 МБ или около того.
В моем реальном веб-приложении использование лексера SQL (того же кода) приводит к увеличению пула приложений примерно до 200 МБ / с (буквально, я убиваю его, когда он достигает примерно 1 ГБ), пока не произойдет сбой w3wp или не замедлит мой ПК до ползти. Это не происходит на пустом тестовом сайте, и в консольном приложении с таким же точным кодом вообще нет проблем. Другие лексеры, такие как C #, не вызывают большой утечки памяти, но имеют тот же эффект увеличения памяти при каждом вызове функции.
Это наводит меня на мысль, что это проблема, связанная с веб-интерфейсом, учитывая, что у консольного приложения нет проблем (создание экземпляра среды выполнения приводит к увеличению памяти на 20 МБ).
Я использую версию 2.7 для МПГ и версию 1.4 для Пегментов.
У меня нет точного кода на данный момент, но это выглядит примерно так:
var options = something;
options["LightweightScopes"] = ScriptRuntimeHelpers.True; // from another SO post, 'true' didn't seem to work
var engine = Python.CreateEngine(options);
//
// set up search paths here...
//
dynamic scope = whatever;
ScriptSource source = engine.CreateScriptSourceFromFile("myscript.py");
// Execute? Compile? It populates the scope at this point...
source.Compile(scope);
// execute (code, lexer name, style)
// this is a python function I have that calls the Pygments code
var highlighted = scope.generate_html("select * from table", "sql", "monokai");
engine.Shutdown();
return highlighted;
Как я уже сказал, я скопировал этот же код в: а) консольное приложение, б) новое пустое веб-приложение, в) свое оригинальное веб-приложение. Консольное приложение не пропускало память, а веб-приложения -.
Я также выполнил функцию как с собственным Python (python myscript.py
), так и с IPY (ipy myscript.py
), и ни у одного не было утечек памяти.
Есть ли какая-то лучшая практика, которой мне не хватает, чтобы избавиться от среды выполнения? Я планирую запустить это в совместно используемой среде, поэтому возможный обходной путь создания движка в другом пуле приложений, вероятно, не будет работать для меня (также, эта огромная утечка с 200 МБ / с - своего рода демонстрация).
В настоящее время, если у кого-то нет чудесного лекарства, я планирую отказаться от своего кода и просто использовать подсветку синтаксиса Javascript. Это очень печально, потому что Пигменты потрясающие ...