Как распараллелить метод класса или разделить объект класса между процессами в python? - PullRequest
0 голосов
/ 25 мая 2018

Я создал класс, содержащий все его экземпляры, и мне нужно распараллелить процесс создания экземпляров, но я не могу решить проблему совместного использования класса как объекта класса.Возможно ли в python 2.7 использование многопроцессорной обработки?

OUTPUT_HEADINGS = []
class MyContainer(object):
    """
    """
    instances = []
    children = []

    @classmethod
    def export_to_csv(cls):
        with open(args.output, "w") as output_file:
            f_csv = csv.DictWriter(output_file, fieldnames=OUTPUT_HEADINGS)
            f_csv.writeheader()
            for instance in cls.instances:
                f_csv.writerow(instance.to_dict())

    def __new__(cls, dat_file):
        try:
            tree = ElementTree.parse(dat_file)
            cls.children = tree.findall("parent_element/child_element")
        except ElementTree.ParseError as err:
            logging.exception(err)

        if not cls.children:
            msg = ("{}: No \"parent_element/child_element\""
                   " element found".format(os.path.basename(dat_file)))
            logging.warning(msg)
            cls.children = []
            return False
        else:
            instance = super(MyContainer, cls).__new__(cls, dat_file)
            instance.__init__(dat_file)
            cls.instances.append(instance)
            cls.children = []
            return True

    def __init__(self, dat_file):
        self._name = os.path.basename(dat_file)
        self.attr_value_sum = defaultdict(list)

        var1 = MyContainer.children[0].find("var1")
        var2 = MyContainer.children[0].get("var2")
        cat_name = "{}.{}".format(var1, var2)

        if cat_name not in OUTPUT_HEADINGS:
            OUTPUT_HEADINGS.append(cat_name)
        # processing and summarizing of xml data

    def to_dict(self):
        return output_dict

def main():
    i = 0
    try:
        for f in FILE_LIST:
            i += 1
            print "{}/{}: {} in progress...".format(i, len(FILE_LIST), f)
            print "{}".format("...DONE" if MyContainer(f) else "...SKIPPED")
    except Exception as err:
        logging.exception(err)
    finally:
        MyContainer.export_to_csv()

if __name__ == '__main__':
    FILE_LIST = []
    for d in args.dirs:
        FILE_LIST.extend(get_name_defined_files(dir_path=d,
                                                pattern=args.filename,
                                                recursive=args.recursive))
    main()

Я пытался использовать multiprocessing.managers.BaseManager, чтобы создать прокси для класса MyContainer, но он может только таким образом создавать объект экземпляра.На самом деле я хочу распараллелить вызов MyContainer(dat_file).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...