2014-10-22 2 views
4

Я работаю с многопроцессорной обработкой Python, чтобы вызвать некоторых работников. Каждый из них должен возвращать массив размером в несколько МБ.Возвращение больших объектов из дочерних процессов в многопроцессорной обработке python

  1. Правильно ли, что, поскольку мой возвращаемый массив создан в дочернем процессе, его необходимо скопировать обратно в родительскую память при завершении процесса? (это, похоже, занимает некоторое время, но это может быть проблема с pypy)
  2. Есть ли механизм, позволяющий родительскому и дочернему объектам получать доступ к одному и тому же объекту в памяти? (Синхронизация не является проблемой, так как только один ребенок будет доступ к каждому объекту)

Боюсь, у меня есть несколько недостатков в том, как питон реализует многопроцессорной обработки, и пытается убедить PyPy играть хорошо не делает вещи все проще. Благодаря!

ответ

6

Да, если массив возвращаемых данных создается в дочернем процессе, он должен быть отправлен родительскому путем путем травления его, отправив маринованные байты обратно родительскому элементу через Pipe, а затем расклеивая объект в родительском элементе. Для большого объекта это довольно медленно в CPython, поэтому это не просто проблема PyPy. Возможно, что производительность хуже в PyPy; Я не пробовал сравнивать эти два, но this PyPy bug, кажется, предполагает, что multiprocessing в PyPy медленнее, чем в CPython.

В CPython существует способ выделить ctypes объектов в общей памяти, через multiprocessing.sharedctypes. PyPy также поддерживает этот API. Ограничение (очевидно) состоит в том, что вы ограничены объектами ctypes.

Существует также multiprocessing.Manager, что позволило бы создать общий объект массив/список в Manager процессе, а затем оба родителя и ребенок может получить доступ к общему списку с помощью Proxy объекта. Недостатком является то, что производительность чтения/записи для объекта намного медленнее, чем в качестве локального объекта, или даже если это был примерно эквивалентный объект, созданный с использованием multiprocessing.sharedctypes.

+0

Ничего себе, это один очень полный ответ. Спасибо. Я собираюсь попробовать sharedctypes, что действительно может помочь. – Miquel