Поток Python для модулей, предварительно импортирующих

Я пишу приложение Python в области научных вычислений. В настоящее время, когда пользователь работает с графическим интерфейсом и запускает новое физическое моделирование, интерпретатор немедленно импортирует несколько необходимых модулей для этого моделирования, таких как Traits и Mayavi . Эти модули тяжелы и занимают слишком много времени для импорта, и пользователь должен ждать ~ 10 секунд, прежде чем продолжить, что плохо.

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

Я хочу отдельный поток, который будет импортировать модули асинхронно. Вероятно, это будет подкласс threading.Thread .

Вот пример использования:

 importer_thread = ImporterThread() importer_thread.start() # ... importer_thread.import('Mayavi') importer_thread.import('Traits') # A thread-safe method that will put the module name # into a queue which the thread in an inifine loop # ... # When the user actually needs the modules: import Mayavi, Traits # If they were already loaded by importer_thread, we're good. # If not, we'll just have to wait as usual. 

Знаете ли вы об этом? Если нет, есть ли у вас какие-либо предложения по поводу дизайна?

4 Solutions collect form web for “Поток Python для модулей, предварительно импортирующих”

Проблема заключается в том, что импорт должен быть завершен до того, как он будет использоваться. В зависимости от того, когда они впервые используются, приложению все равно придется блокировать в течение 10 секунд, прежде чем он сможет начать все равно. Гораздо более продуктивным было бы профилировать модули и выяснить, почему они так долго импортируются.

Почему бы просто не сделать это при запуске приложения?

 def background_imports(): import Traits import Mayavi thread = threading.Thread(target=background_imports) thread.setDaemon(True) thread.start() 

Общая идея хороша, но сессия Python / GUI может быть не такой отзывчивой, пока фоновый поток import ; к сожалению, import своей сути и неизбежно «блокирует» Python существенно (это не просто GIL, есть особая дополнительная блокировка для импорта).

Все еще стоит попробовать, так как это может сделать вещи немного лучше – это тоже очень просто, так как Queue s по сути поточно-безопасны, и, помимо того, что Queue 's put и get , все, что вам нужно, это в основном __import__ . Тем не менее, не удивляйтесь, если это не поможет, и вам все еще нужно дополнительное количество.

Если у вас есть диск, который по своей сути очень быстр, но с ограниченным пространством, например, «RAM-диск» или особенно удачный твердотельный накопитель, возможно, стоит сохранить необходимые пакеты в .tar.bz2 (или в другой форме архив) и распаковывать его на быстрый диск при запуске программы (это, по сути, только I / O, и поэтому он не будет сильно блокировать ситуацию – операции ввода-вывода быстро освобождают GIL), а также особенно легко делегировать подпроцесс, исполняемый tar xjf или тому подобное).

Если некоторые из медленности импорта связаны с огромным количеством файлов .py/.pyc/.pyo , стоит попытаться сохранить их (в форме .pyc только , а не как .py ) в zip-файле и импортировать оттуда ( но это только помогает с накладными расходами ввода-вывода, в зависимости от вашей ОС, файловой системы и диска: не помогает с задержками из-за загрузки огромных DLL или выполнения кода инициализации в пакетах во время загрузки, которые, как я подозреваю, являются более вероятными виновниками медлительность).

Вы могли бы также рассмотреть возможность разделения приложения на multiprocessing – снова используя Queues (но многопроцессорный вид) для связи – чтобы как импорт, так и некоторые тяжелые вычисления были делегированы нескольким вспомогательным процессам и, таким образом, сделаны асинхронными (это также может помочь полностью используя несколько ядер сразу). Я подозреваю, что, к сожалению, это может быть сложно правильно организовать для задач визуализации (например, вы предположительно делаете с майави), но это может помочь, если у вас также есть несколько «чистых тяжелых вычислений» пакетов и задач.

«пользователь работает с графическим интерфейсом и запускает новое физическое моделирование»

Не совсем понятно. «Работает с графическим интерфейсом» означает двойной щелчок? Дважды нажмите, что? Некоторое приложение GUI wxWidgets? Или ИДЕТ?

Если да, то что означает «запускает новое физическое моделирование»? Нажмите кнопку в другом месте? Кнопка GUI для вызова панели, где они пишут код? Или они импортируют скрипт, который они списали?

Почему происходит импорт до начала моделирования? Как долго проходит симуляция? Что показывает GUI?

Я подозреваю, что есть способ быть намного, намного более ленивым, делая большой импорт. Но из описания трудно определить, есть ли момент времени, когда импорт не имеет особого значения для пользователя.

Нити не очень помогают. Что помогает переосмыслить опыт пользовательского интерфейса.

  • многопоточность jython
  • Почему поток python потребляет столько памяти?
  • Передать аргументы ключевого слова целевой функции в потоке Python.
  • PyQt - изменение GUI из другого потока
  • Нити многопроцессорности Python никогда не присоединяются при большом объеме работы
  • проблема с загрузкой изображения (python)
  • Python - одновременно запускать две команды
  • AssertionError при потоковой передаче в Python
  • QObject (QPlainTextEdit) и проблемы многопоточности
  • что такое использование join () в потоке python
  • как я могу использовать uwsgi web.py для запуска фоновой функции?
  •  
    Interesting Posts for Van-Lav

    Как удалить строку в цикле с помощью Python?

    Python: Извлечение переменных из пространства имен

    django-taggit: сделать теги не требуемыми в admin

    Python объединяет два для циклов

    ускорение последовательной проверки, если точка находится в форме в Python

    как определить, импортирован ли скрипт python в качестве модуля или запускается как скрипт?

    Ошибка разблокировки типа при изменении моделей SqlAlchemy

    Как разрешить django admin установить поле в NULL?

    Python. Печать MAC-адреса из 6-байтовой строки

    Возможно ли распараллелить вызовы get_attribute selenium webdriver в python?

    Как отличить добавленные предложения и измененные предложения с помощью difflib и nltk?

    Приложение tkinter добавляет контекстное меню правой кнопки мыши?

    Отслеживание объектов: MATLAB и Python Numpy

    django allauth социальная аутентификация, полученная по электронной почте, соответствует существующей электронной почте пользователя?

    Чтение строк документа пользователю (python)

    Python - лучший язык программирования в мире.