2014-11-25 3 views
0

У меня есть класс Python, который использует многопроцессорный пул для обработки и очистки большого набора данных. Метод, который выполняет большую часть очистки, - это «dataCleaner», которому необходимо вызвать второй метод «processObservation». Я довольно новичок в многопроцессорности Python, и я не могу понять, как гарантировать, что метод processObservation будет вызван из 'cleanData', когда будет создан новый процесс. Как я могу это сделать? Мое предпочтение было бы сохранить все эти методы в классе. Я подозреваю, что это связано с определением «», но я не уверен, как его соответствующим образом изменить.Python Многопроцессорный вызов нескольких методов

def processData(self, dataset, num_procs = mp.cpu_count()): 
    dataSize = len(dataset) 
    outputDict = dict() 
    procs = mp.Pool(processes = num_procs, maxtasksperchild = 1) 

    # Generate data chunks for processing. 
    chunk = dataSize/num_procs 
    dataChunk = [(i, i + chunk) for i in range(0, dataSize, chunk)] 
    count = 1 
    print 'Number of data chunks %d' %len(dataChunk) 
    for i in dataChunk: 
     procs.apply_async(self.dataCleaner, args = (dataset[i[0]:i[1]], count,)) 
     count += 1 
    procs.close() 
    procs.join() 

def cleanData(self, data, procNumber): 
    print 'Spawning new process: %d' %os.getpid() 
    tempDict = dict() 
    print len(data) 
    for obs in data: 
     key, value = processObservation(obs) 
     tempDict[key] = value 
    cPickle.dump(tempDict, open('../dataMP/cleanedData_' + str(procNumber) + '.p', 'wb')) 

def __call__(self, dataset, count): 
    return self.cleanData(dataset, count) 
+0

ли '' dataCleaner' и cleanData' должен быть тот же самый метод? И что конкретно не работает с тем, что вы сейчас делаете? – dano

+0

Нет, они не являются отдельными методами. Что происходит, так это то, что никакой вывод не записывается в маринованные файлы. Похоже, что проблема возникает в цикле for cleanData. Когда я разделяю функции и запускаю их с помощью пула вне класса, он отлично работает. – mle

+0

Если у вас возникли проблемы с классом python, зачем отправлять функции python, а не соответствующие методы внутри класса (и входящего класса)? –

ответ

Смежные вопросы