Python: Особенности работы с multiprocessing

Jul 31, 2013 05:05

Черновые заметки по общению с модулем multiprocessing - возможно они станут ответами на чьи-нибудь вопросы.

1. Если у вас нормально работал отдельно код использующий Manager, но внезапно перестал работать после вставки в ваш проект, проверьте, не делаете ли вы manager.start() до того как сделать fork. Между прочим multiprocessing.Manager() возвращает уже стартованный multiprocessing.managers.SyncManager. Симптомы - ошибка "IOError: [Errno 32] Broken pipe".

2. Нельзя использовать mutable типы в качестве элементов других mutable типов используемых через Proxy manager'а, даже если "вложенный" mutable объект тоже обёрнут в Proxy. Например, следующая конструкция некорректна:

d = manager.dict()
d[1] = manager.list()
Приводит это к следующему:
a) Создаётся dict() в процессе manager'а и возвращается DictProxy.
b) Создаётся list() в процессе manager'а и возвращается ListProxy.
c) ListProxy передаётся в __setitem__ и после свёртывания-развёртывания в dict в процессе manager'а попадает просто list. Пока всё нормально.
d) Когда вы пытаетесь использовать d[1] вам из DictProxy.__getitem__ возвращается просто маршализированная копия списка, а не ListProxy.

NB: Оказывается, можно. зарегистрировав специальный тип в manager'е (без метода создания - create_method=False), и использовать этот тип в определении возвращаемого значения в методе объекта - проще всего, как _method_to_typeid_ в proxy. В качестве примера можно посмотреть PoolProxy._method_to_typeid_ и типы Iterator и AsyncResult.

python

Previous post Next post
Up