В настоящее время я использую генераторы как быстрый способ получения прогресса в длительных процессах, и мне интересно, как это обычно делается, так как я нахожу это не очень элегантным ...
Позвольте мне сначала объяснить, у меня есть модуль engine.py, который выполняет некоторую обработку видео (сегментацию, вычитание bg / fg и т. Д.), Которая занимает много времени (от секунд до нескольких минут).
Я использую этот модуль из графического интерфейса, написанного на wxpython и консольного скрипта.
Когда я посмотрел, как реализовать диалоги прогресса в wxpython, я увидел, что мне нужно каким-то образом получить значение прогресса для обновления моего диалога, что является чистой логикой, которую вы признаете ...
Поэтому я решил использовать количество кадров, обработанных в моих функциях движка, выводить текущий номер кадра каждые 33 кадра и выводить None после завершения обработки.
* * * * * * *
, делая это вот так:
dlg = wx.ProgressDialog("Movie processing", "Movie is being written...",
maximum = self.engine.endProcessingFrame,self.engine.startProcessingFrame,
parent=self,
style = wx.PD_APP_MODAL | wx.PD_ELAPSED_TIME | wx.PD_SMOOTH | wx.PD_CAN_ABORT)
state = self.engine.processMovie()
f = state.next()
while f != None:
c, s = dlg.Update(f, "Processing frame %d"%f)
if not c:break
f = state.next()
dlg.Destroy()
Это работает очень хорошо, заметных потерь скорости нет, но я бы хотел иметь возможность вызывать функцию processMovie () без необходимости работать с генераторами, если я этого не хочу.
Например, мой консольный скрипт, который использует модуль движка, не заботится о прогрессе, я мог бы использовать его, но он предназначен для выполнения в среде, где нет отображения, так что мне действительно все равно, как работает ...
Кто-нибудь с другим дизайном, который я придумал? (используя потоки, глобалы, процессы и т. д.)
Где-то должен быть дизайн, который делает эту работу чище, я думаю: -)