#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
Я хотел добавить, что этот код далек от основной функции программного обеспечения. Все примеры, которые я нашел, связанные с многопроцессорной обработкой и ориентацией объектов, содержат некоторый элемент многопроцессорной обработки, выполняемый внутри основной функции.