Перезапуск интерпретатора Python бесшумно

Добавить новую услугу

  dep:
    image: elgalu/selenium
    command: echo 0
    restart: "no" # ensures it does not get recreated

Добавить в Zalenium

  depends_on:
       - selenium
       - dep # ensures pull/launch order
7
задан Benoit 11 January 2009 в 17:58
поделиться

5 ответов

Попробуйте этот код из рецептов ActiveState: http://code.activestate.com/recipes/572213/

Это расширяет рассол, таким образом, это поддерживает соление чего-либо определенного в консоли оболочки. Теоретически необходимо просто смочь засолить основной модуль, согласно их документации:

import savestate, pickle, __main__
pickle.dump(__main__, open('savestate.pickle', 'wb'), 2)
4
ответ дан 7 December 2019 в 10:09
поделиться

Я предложил бы заняться проблемой первопричины.

"Приложение занимает много времени для запуска, и у меня нет способности перезапустить интерпретатор, не перезапуская целое приложение"

Я сомневаюсь, что это на на самом деле 100% верно. Если полное приложение является результатом закона конгресса, хорошо, это не может быть изменено. Но если бы полное приложение было записано настоящими людьми, то нахождение и перемещение кода для перезапуска интерпретатора Python должны быть возможными. Это более дешево, более просто и более надежно, чем что-либо еще, что Вы могли бы сделать для бездельничания проблемы.

1
ответ дан 7 December 2019 в 10:09
поделиться

хранение названий всех модулей в sys.modules, что интерпретатор Python, запущенный с и затем удаляющий все новые модули из sys.modules при необходимости. Это, кажется, делает интерпретатор готовым повторно импортировать те же модули даже при том, что он уже импортировал их прежде.

Подход принуждения перезагрузки модуля может быть сделан работать при некоторых обстоятельствах, но это является немного волосатым. Таким образом:

  • Необходимо удостовериться, что все модули, которые имеют зависимости друг от друга, все перезагружаются сразу. Таким образом, любой модуль 'x', который действительно 'импортирует y' или 'из импорта y...', должен быть удален из sys.modules в то же время, что и модуль 'y'.

  • Для этого процесса будет нужна защита с блокировкой, если Ваше приложение или какой-либо другой активный модуль будут использовать потоки.

  • Любой модуль, который оставляет рычаги, указывающие на себя в других модулях, не может полезно быть перезагружен, поскольку ссылки на старый модуль останутся в неперезагруженном/неперезагружаемом коде. Это включает материал как рычаги исключения, сигналы, фильтры предупреждений, кодировка, патчи обезьяны и так далее. Если Вы начинаете беспечно перезагружать модули, содержащие чужой код, Вы могли бы быть удивлены, как часто они действительно наполняют как этот, потенциально приводя к тонким и любопытным ошибкам.

Таким образом, чтобы заставить это работать у Вас должны быть четко определенные границы между взаимозависимыми модулями - "был импортированный в начальное время запуска", вероятно, не довольно достаточно хорошо - и удостоверяться, что они приятно инкапсулируются без неожиданных зависимостей как исправление обезьяны.

Это может быть основано на папке, так же например, что-либо в/home/me/myapp/lib могло быть перезагружено как единица при оставлении других модулей в покое - особенно содержание stdlib в, например,/usr/lib/python2.x/, который в целом не надежен для перезагрузки. У меня есть код для этого в пока еще невыпущенной обертке перезагрузки веб-приложения, если Вам нужно.

Наконец:

  • Необходимо знать немного о внутренностях sys.modules, конкретно что он оставляет набор 'Ни одного' значениями для выражения отказавшего относительного импорта. Если Вы не удаляете их в то же время, что и Вы удаляете свои другие значения модуля, последующая попытка импортировать модуль может (иногда) заканчивать тем, что не импортировала 'Ни один', ведя к запутывающим ошибкам.

Это - противная деталь реализации, которая могла бы изменить и повредить Ваше приложение в некоторой будущей версии Python, но это - цена за проигрывание с sys.modules неподдерживаемыми способами.

1
ответ дан 7 December 2019 в 10:09
поделиться

Один очень hacky и ошибка склонный подход мог бы быть c модулем, который просто копирует память в файл, таким образом, это может быть загружено назад в следующий раз. Но так как я не могу предположить, что это всегда работало бы правильно, соление будет альтернативой?

Если Вы можете сделать все свои модули pickleable, чем необходимо смочь засолить все в globals (), таким образом, он может быть перезагружен снова.

0
ответ дан 7 December 2019 в 10:09
поделиться

Если Вы знаете заранее модули, классы, функции, переменные, и т.д.... используемые, Вы могли засолить их к диску и перезагрузке. Я не уверен первое, что пришло на ум лучший способ заняться проблемой, если Ваша среда содержит много неизвестных. Хотя, это может быть достаточным для соления globals и местных жителей.

0
ответ дан 7 December 2019 в 10:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: