Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 31, 2012 19:26:10

Levelup
От:
Зарегистрирован: 2011-01-10
Сообщения: 77
Репутация: +  0  -
Профиль   Отправить e-mail  

wxPython и Multiprocessing.

Всем привет!

Есть некоторые функции обработки изображений, которые занимают приличное время. Необходимо реализовать параллельность. Потоки сразу отбрасываются, всему виной GIL. Пытаюсь подружить wxPython и multiprocessing. Взял за основу http://wiki.wxpython.org/LongRunningTasks и сделал то же самое, только с процессами. Все хорошо, gui на время выполнения процесса не зависает.
То есть примерно так:

class WorkerProcess(multiprocessing.Process):
    def __init__(self, *args, **kwargs):
        multiprocessing.Process.__init__(self, *args, **kwargs)
        self.start()
    def run(self):
        result = my_fuction() - тут функция обработки. 
 
Но, дело в том, что при создании нового процесса функция обработки инициализирует одну библиотеку, что сильно замедляет работу. Поэтому пытаюсь реализовать все это с помощью multiprocessing.Pool, чтобы один раз проинициализировать библиотеку, а после просто вызывать необходимые функции. И тут появляются проблемы, при вызове функций map или apply GUI зависает.
Может кто-то уже реализовывал подобное?


Выдрал из исходников, пытался как-то запустить из созданного процесса, ничего не выходит. Помогите, пожалуйста.

RUN = 0
class WorkerPool(multiprocessing.pool.Pool):
    Process = WorkerProcess
    def __init__(self, *args, **kwargs):
        multiprocessing.pool.Pool.__init__(self, *args, **kwargs)
    def map(self, func, iterable, chunksize=None):
        assert self._state == RUN
        return self.map_async(func, iterable, chunksize)



Отредактировано Levelup (Окт. 31, 2012 19:26:40)

Офлайн

#2 Ноя. 1, 2012 06:43:08

Levelup
От:
Зарегистрирован: 2011-01-10
Сообщения: 77
Репутация: +  0  -
Профиль   Отправить e-mail  

wxPython и Multiprocessing.

Все оказалось намного проще. Решил проблему с помощью callback функции.

pool.apply_async(dark_frame_correction, [[img, path]],
                         callback=self.OnProccessingResult)



Отредактировано Levelup (Ноя. 1, 2012 06:43:36)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version