2016-01-15 5 views
0

У меня есть 6 разных классов.Обработка объектов разных классов в Python параллельно

В основном я создаю один объект каждого класса.

Я хочу называть eachObject.processFiles() каждого объекта параллельно.

Метод processFiles обрабатывает объектные файлы, читая их, манипулирует данными и сохраняет их в постоянном объекте. Каждый вызов processFiles занимает около 5 минут. Если это делается последовательно, то основной занимает около 30 минут.

Я сейчас делаю это последовательно, но хочу ускорить обработку 6 объектов своими файлами с минимальным временем процессора. Все объекты независимы друг от друга, и я думаю, что многопоточный способ будет эффективным. Но я еще не делал многопоточность. Поэтому хотелось бы знать, безопасно ли это сделать и как это сделать. Фрагмент кода поможет.

Как это сделать параллельно?

class system(object): 
    def __init__(self, leNameList): 
    self.files = fileNameList 

    def processFiles(self): 
    self.feeds= self.readFiles() 
    self.processFeeds() 

class A(system): 
    def processFeeds(self): 
    """ process the feed 
     in A way """ 

class B(system): 
    def processFeeds(self): 
    """ process the feed 
     in B way """ 

def main(): 
    aObj = A(fileList) 
    bObj = B(fileList2) 
    aObj.processFiles() 
    bObj.processFiles() 
+0

Plz изменить свой вопрос. Замечание слишком неструктурировано для чтения –

+0

Невозможно сказать, не зная, каковы ваши узкие места. Также может быть проще срезать по-другому: вместо выполнения (A для всех файлов), (B для всех файлов) и т. Д. Вы можете делать (A, B и т. Д.) В каждом файле? Это может помочь, только загружая каждый файл один раз. –

+0

Нет, вы хотите обработать файлы в ** максимальном ** времени процессора и минимальном ** настенной ** времени. – rbp

ответ

0

Используйте модуль multiprocessing.

import multiprocessing 

class system(object): 
    def __init__(self, fileNameList): 
    self.files = fileNameList 

    def processFiles(self): 
    # self.feeds= self.readFiles() 
    return self.processFeeds() 

class A(system): 
    def processFeeds(self): 
    return ["A feed", "example data"] + self.files 

class B(system): 
    def processFeeds(self): 
    return ["B feed", "hello world"] + self.files 

def process_file_task(processor): 
    return processor.processFiles() 

def main(): 
    aObj = A(["a"]) 
    bObj = B(["b"]) 
    data = multiprocessing.Pool().map(process_file_task, [aObj, bObj]) 
    print(data) 

Здесь я заселена код с примерами данных, так что вы можете протестировать это решение из коробки, но суть его является:

  • Вместо изменения глобальных переменных или объект, вернуть данные, которые вы генерируете.
  • Используйте multiprocessing.Pool().map для выполнения функций в разных процессах и возврата каждого результата в порядке.

Недостатком этого является то, что multiprocessing может быть немного привередливы работать с временами, и вы должны убедиться, что все проходит границы процесса можно маринованные.


Еще одна вещь, которую нужно проверить в своем коде - это списки файлов. Если у них много общих файлов, вы должны отделить процесс чтения файлов и убедиться, что один и тот же файл не нужно читать дважды.

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