Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Я использовал бы 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 safe to do GUI stuff here

Ответ 2

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

Ответ 3

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

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

В то время как подпроцесс/многопроцессор является стандартным способом сделать это, вы также можете взглянуть на Parallel Python.

Ответ 4

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