Использование многопроцессорной обработки для возврата нескольких экземпляров класса внутри общего контейнерного класса

#python #python-multiprocessing

Вопрос:

У меня есть метод класса с большим количеством текста/данных, который я хотел бы разбить на 36 ядер, используя многопроцессорный пакет Python. Часть этого кода перенесена из проекта R, в котором я делал примерно то же самое. Используя R, это было относительно просто, я разделил фрейм данных на N (36 в этом примере) фрагментов, а затем запустил многопроцессорный foreach цикл над функцией с индексом foreach цикла, повторяющим разбитый фрейм данных.

В приведенном ниже коде экземпляр этого класса вызывает метод bottom buildAllPatients , который извлекает все идентификаторы патентов ( patidList ) и передает их в buildPatientsFromPatid . В свою очередь, этот метод вызывает закрытый метод __populatePatient для каждой записи patidList . Он создает объект класса Patient , выполняет коллекцию геттеров и сеттеров, а затем возвращает Patient объект, чтобы добавить его в вызываемый экземпляр класса-контейнера Patients .

Я хочу добавить пул работников внутри buildPatientsFromPatid метода, по сути, превратив цикл for в некоторый многопроцессорный код. Каждый работник должен вернуть уникальный Patient объект после вызова __populatePatient , а затем вернуть его в общий patients объект.

По сути, это полезно, когда имеется где-то порядка 500 000 идентификаторов пациентов, каждый из которых превращается в объект пациента и имеет внутри большое количество геттеров и сеттеров __populatePatient .

 def __populatePatient(self, featureList, patidStr, indDF):
    #instantiates some objects, executes some getters and setters
    #returns the object patient to be added to the collector class Patients
    return patient

def buildPatientsFromPatid(self, patidList, featureList) -> Patients:
    # go through each entry of patidList, build a new Patient and assigned to a PatientsClass instance
    patients = Patients()

    #Iterate over each patient ID calling the private function
    #to build a Patient object, return it and add to the larger
    #Patients object
    for patidStr in patidList:
        patients.addPatient(self.__buildPatientFromPatid(patidStr, featureList))
    return patients


# This is called FIRST....
def buildAllPatients(self, featureList):
    patidList = self.ioDF.patid.unique()
    patients = self.buildPatientsFromPatid(patidList, featureList)
    return patients
 

Обновление № 1
Я хотел добавить, что этот код далек от основной функции программного обеспечения. Все примеры, которые я нашел, связанные с многопроцессорной обработкой и ориентацией объектов, содержат некоторый элемент многопроцессорной обработки, выполняемый внутри основной функции.