2010-10-04 1 views
2

У меня есть приложение wx.python, которое принимает некоторые файлы и обрабатывает их при нажатии кнопки. Мне нужно обрабатывать их параллельно.WX.Python и многопроцессорность

Я использую этот код в функции связанного кнопки:

my_pool = multiprocessing.Pool(POOLSIZE) 

    results=[digest_pool.apply_async(self.fun, [args]) for file in list_files() ] 

    my_pool.close() 

    my_pool.join() 

    for result in results : 

     print result.get() 

Но, кажется, этот код не работает вообще, даже если я что-то напечатать на удовольствие. Я не получил никакого результата, и мое приложение GUI застряло. Может ли кто-нибудь помочь? В чем проблема и как ее решить, используя модуль многопроцессорности пула внутри класса wx frame?

ответ

1

Похоже, что вы столкнулись с довольно распространенной проблемой, с которой сталкиваются люди, пытающиеся использовать потоки с инструментами GUI. Ядро проблемы заключается в том, что вы никогда не должны блокировать основной поток графического интерфейса в коде. Графический инструментарий должен иметь возможность постоянно реагировать на события. Когда вы совершаете вызов my_pool.join(), вы помещаете основной поток в режим сна, и результат заключается в том, что весь ваш процесс будет заблокирован.

Я не особо знаком с wxWidgets, но я уверен, что есть несколько шаблонов, где можно использовать потоки с ним. Легко оттолкнуть фоновые потоки из потока графического интерфейса, но получение результатов назад обычно является трюком. Вам понадобится какое-то асинхронное событие «work done», которое вы можете отправить в основной поток GUI при завершении фоновой операции. Именно то, как это делается, отличается от инструментария до инструментария. Я не уверен, что такое механизм для wxWidgets, но я бы ожидал, что быстрый поиск в Google вызовет ответ (или, возможно, добрый комментатор предоставит ссылку ;-)

+0

Вот ссылка на соответствующий демонстрационный код wxPython: http://svn.wxwidgets.org/svn/wx/wxPython/trunk/demo/DelayedResult.py. – Mark

+0

также http://wiki.wxpython.org/LongRunningTasks –