Поток 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?

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

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

  • Когда функция numba компилируется?
  • numpy и Global Interpreter Lock
  • Как порождать будущее, только если доступен свободный рабочий
  • TNonblockingServer в аварийных ситуациях, когда открывается TFramedTransport
  • как начать поток, когда django runningerver?
  • Исключение в потоке: должна быть последовательность, а не экземпляр
  • Python: как многопоточная функция, возвращающая несколько значений
  • несколько потоков QWebView в PyQt4
  •  
    Interesting Posts for Van-Lav

    как объединить два словаря для создания нового в Python?

    Получить случайное логическое значение в python?

    Как игнорировать неожиданные аргументы ключевого слова, переданные функции?

    Как удалить '\ n' из конца строк внутри списка?

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

    Форматирование JSON с добавлением \ символов при добавлении файла, но не в строку вывода

    Модели Django.Модельный суперкласс

    Как де-импортировать модуль Python?

    Что такое «мягкий лимит частной памяти» в GAE?

    эквивалентно команде find coreutil в python 3 для рекурсивного возвращения всех файлов и папок в структуру каталогов?

    Разделение столбцов файлов данных на отдельные массивы в Python

    Обратный Тан в питоне (tan-1)

    Сценарий Python не будет работать через TextMate, ОК в IDLE и Eclipse

    Как выполнить итерацию по файловому фрейму pandas multiindex с использованием индекса

    Модуль быстрой простой факторизации

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