2009-04-08 2 views
12

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

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

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

ответ

4

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

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

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

+0

Я никогда раньше не работал с несколькими процессами. С чего начать? Кроме того, я понял, что есть разные способы сделать это. Какой из них выбрать? –

+0

N.B., имейте в виду, что, поскольку это программа для моделирования, производительность очень важна. –

+0

Если вы можете использовать python 2.6, я считаю, что многопроцессорный модуль будет стандартным способом выполнения этого. Это должно дать вам столько же производительности, сколько и ваша ОС и оборудование. –

7

Я бы использовал 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 
0

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

7

Существует довольно подробная информация об wxPython wiki about long running tasks, которая может быть полезна. Они в основном используют поток и wx.PostEvent для обработки связи между потоком и основным циклом событий wx.

Смежные вопросы