Многопоточная работа с единственным объектом

У меня есть Класс по которому я создаю объект и хочу совершить параллельную работу по вызову одного и того же метода.

Вот моя упрощенная реализация:

import multiprocessing
class A():
    def __init__(self):
        self.a = 0
    def sum(self, num):
        self.a += num
        return self.a
    def multi_sum(self, sum_list):
        with multiprocessing.Pool() as pool:
            res = pool.map(self.sum,sum_list)
        print(self, res)
if __name__ == '__main__':
    x = A()
    x.multi_sum(range(1,10)

Как я понял, каждый процесс создает копию начального объекта и модифицирует ее.

Как мне сделать так чтобы каждый процесс модифицировал первоначальный объект и передавал его дальше?


Ответы (1 шт):

Автор решения: CrazyElf

Достаточно поменять одну строчку, но только если у вас питон 3.7 или позднее:

with multiprocessing.Pool() as pool:
                     ^^^^^^

На вот эту:

with multiprocessing.pool.ThreadPool() as pool:
                     ^^^^^^^^^^^^^^^^^

Тогда будут использоваться потоки вместо процессов и поведение будет такое, как вы хотите - будет меняться один объект, а не его копии в разных процессах.

Но помните про GIL, толку от такой многопоточности может быть не так много, как вам хотелось бы.

→ Ссылка