Как я могу добавить к переменным класса, используя многопроцессорность в Python? - PullRequest
3 голосов
/ 07 ноября 2019

У меня есть эта программа, где все встроено в объект класса. Есть функция, которая выполняет 50 вычислений другой функции, каждая с разным входом, поэтому я решил использовать многопроцессорность, чтобы ускорить ее. Однако список, который должен быть возвращен в конце, всегда возвращается пустым. есть идеи? Вот упрощенная версия моей проблемы. Вывод main_function () должен быть списком, содержащим числа 0-9, однако список возвращается пустым.

class MyClass(object):
    def __init__(self):
        self.arr = list()

    def helper_function(self, n):
        self.arr.append(n)

    def main_function(self):
        jobs = []

        for i in range(0,10):
            p = multiprocessing.Process(target=self.helper_function, args=(i,))
            jobs.append(p)
            p.start()

        for job in jobs:
            jobs.join()

        print(self.arr)

Ответы [ 2 ]

6 голосов
/ 07 ноября 2019

arr - это list, который не будет использоваться всеми экземплярами подпроцесса.

Для этого вам нужно использовать объект Manager для создания управляемого списка, который знает о том, чтоон разделяется между процессами.

Ключ:

self.arr = multiprocessing.Manager().list()

полный рабочий пример:

import multiprocessing

class MyClass(object):
    def __init__(self):
        self.arr = multiprocessing.Manager().list()

    def helper_function(self, n):
        self.arr.append(n)

    def main_function(self):
        jobs = []

        for i in range(0,10):
            p = multiprocessing.Process(target=self.helper_function, args=(i,))
            jobs.append(p)
            p.start()

        for job in jobs:
            job.join()

        print(self.arr)

if __name__ == "__main__":
    a = MyClass()
    a.main_function()

этот код теперь печатается: [7, 9, 2, 8, 6, 0, 4, 3, 1, 5]

0 голосов
/ 07 ноября 2019

многопроцессорность утомительна.

Для простых задач многопроцессорной обработки я бы порекомендовал:

from multiprocessing.dummy import Pool as ThreadPool


class MyClass(object):
    def __init__(self):
        self.arr = list()

    def helper_function(self, n):
        self.arr.append(n)

    def main_function(self):
        pool = ThreadPool(4)
        pool.map(self.helper_function, range(10))
        print(self.arr)


if __name__ == '__main__':
    c = MyClass()
    c.main_function()

Идея использования карты вместо сложных вызовов многопоточности взята из одной из моих любимых публикаций в блоге:https://chriskiehl.com/article/parallelism-in-one-line

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