Python/wxPython: постоянная работа в фоновом режиме

Я делаю программу для запуска симуляций на Python с интерфейсом wxPython. В программе вы можете создать симуляцию, и программа визуализирует (= вычисляет) ее для вас. Рендеринг иногда может занимать очень много времени.

Когда пользователь запускает симуляцию и определяет начальное состояние, я хочу, чтобы программа непрерывно отображала симуляцию в фоновом режиме, в то время как пользователь может делать разные вещи в программе. Что-то вроде заполняющейся полосы в стиле YouTube: вы можете воспроизводить симуляцию только до того момента, когда она была отрендерена.

Как мне запустить функцию рендеринга?


person Ram Rachum    schedule 08.04.2009    source источник


Ответы (4)


Я бы использовал threading.Thread для запуска кода в фоновом режиме и wx.CallAfter для публикации обновлений в моем потоке окна, чтобы отобразить их пользователю.

thread = threading.Thread(target=self.do_work)
thread.setDaemon(True)
thread.start()

...

def do_work(self):
    # processing code here
    while processing:
        # do stuff
        wx.CallAfter(self.update_view, args, kwargs)

def update_view(self, args):
    # do stuff with args
    # since wx.CallAfter was used, it's safe to do GUI stuff here
person FogleBird    schedule 14.04.2009

На вики-сайте wxPython есть много полезной информации о длительных задачах. В основном они используют поток и wx.PostEvent для обработки связи между потоком и основным циклом событий wx.

person John Montgomery    schedule 16.04.2009

Запустите новый процесс для рендеринга в фоновом режиме и периодически проверяйте, не вернулся ли он.

Вы можете найти документацию для модуля подпроцесса здесь, а также для модуля multiprocess здесь. Как сказал Джей, многопроцессорность, вероятно, лучше, если вы используете Python 2.6. Тем не менее, я не думаю, что между ними будет какая-то разница в производительности. Multiprocess просто кажется оболочкой для подпроцесса, упрощающей выполнение определенных действий.

Хотя subprocess/multiprocess является стандартным способом сделать это, вы также можете взглянуть на Параллельный Python.

person Chris Upchurch    schedule 08.04.2009
comment
Я никогда раньше не работал с несколькими процессами. С чего начать? Кроме того, я понял, что есть разные способы сделать это. Какой из них я должен выбрать? - person Ram Rachum; 08.04.2009
comment
NB, имейте в виду, что, поскольку это программа для моделирования, производительность очень важна. - person Ram Rachum; 08.04.2009
comment
Если вы можете использовать python 2.6, я считаю, что модуль многопроцессорности будет стандартным способом достижения этого. Это должно дать вам столько же производительности, сколько может обеспечить ваша ОС и оборудование. - person Jay Kominek; 08.04.2009
comment
К вашему сведению, если вы используете Windows с wxPython, лучше использовать 2.5 lists.wxwidgets.org/pipermail/wxpython-users/2009-март/ - person DrBloodmoney; 08.04.2009
comment
Я также слышал о Stackless Python. Актуально ли это? Это лучше, чем подпроцесс/мультипроцесс? - person Ram Rachum; 08.04.2009

Если вы не возражаете против использования немного другого подхода, вы можете взглянуть на stackless python и создать тасклет для вашего процесса рендеринга. Я считаю, что это очень легко использовать лично.

person attwad    schedule 14.04.2009