Как добавить объект в многопроцессорные процессы? - PullRequest
1 голос
/ 17 февраля 2020

Я привык использовать ipcluster из ipyparallel, где я могу загрузить объект рабочим через dview['object'] = object.

Мне интересно, как это сделать с multiprocessing. Мне бы хотелось, чтобы он был асинхронным, чтобы в итоге я мог табулировать выполненные задания, чтобы отобразить индикатор выполнения, но сейчас я в основном заинтересован в загрузке объекта (например, большого фрейма данных mem), чтобы у меня не было передать его с помощью функции и таким образом замедлить работу:

from ipyparallel import Client
import pandas as pd

rc = Client(profile='default')
dview = rc[:]
lview = rc.load_balanced_view()

myobject = pd.read_table('/some/path/')
#                                  ############################################
dview['myobject'] = myobject       #### <- how do I do this using multiprocess?
#                                  ############################################

def dowork(rowstart):
    rowend = rowstart + (1000-1)
    ...
    return pd.DataFrame(work)

jobs = []
for i in range(0,len(myobject.index),1000):
    jobs.append(lview.apply_async(dowork, i))

newdf = pd.concat([j.r for j in jobs])

1 Ответ

1 голос
/ 18 февраля 2020

Q : как это сделать с multiprocessing?

По определению параллелизм на основе процессов в python копирует все состояние интерпретатора python, включая все его внутренние переменные и так далее, в новые рабочие процессы при их создании. Операционная система решает, как это можно или нельзя сделать (подробности, риски и другие недостатки см. В документации multiprocessing).

Хотя это дорогостоящий, но принципиально необходимый шаг, чтобы избежать от центрального монополиста GIL-замка c re- [SERIAL] - от всей обработки python, этот метод гарантирует вашим процессам "знать" myobject путем проектирование (icluster пришлось повторно транслировать объект на все удаленные узлы и из-за более высоких затрат на несколько порядков (от нескольких сотен [ns] до значительно выше [ms]) локального / удаленного *) 1022 * -операции + задержки на транспортных услугах сетевого уровня L2 / L3, это позволяет вам заботиться о вас, не забывая распределять все те объекты, которые понадобятся вашему коду, вручную перед запуском заданий.

порожденные multiprocessing порожденные процессы "знают" то же, что и родительский python интерпретатор, поэтому в этом контексте ваша жизнь становится проще.

...