Как эффективно обмениваться словарями и списками между процессами с помощью ProcessPool - PullRequest
1 голос
/ 10 июля 2020

Давайте рассмотрим следующий пример:

from pathos.pools import ProcessPool

class A:
    def run(self, arg: int):

        my_list = list(...)
        my_dict = dict(...)

        def __run_parallel(arg: int):
            local_variable = 42

            # some code and read access...

            read_only1 = my_list[...]
            read_only2 = dict[...]


            # some code and write access...

            my_list.append(arg)
            my_dict[arg] = local_variable

        ProcessPool(4).map(__run_parallel, range(1000))

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

До сих пор я пытался передать my_list и my_dict в качестве дополнительных аргументов __run_parallel, используя pa.helpers.mp.Manager. Однако, несмотря на то, что он работает, он ужасающе медленный (поскольку он явно создан для распределенных систем).

Поскольку я работаю над этим в режиме проб и ошибок уже несколько вечеров, я хотел бы спросить знает ли кто-нибудь, как эффективно использовать общие dict и list внутри __run_parallel, используя pathos.

1 Ответ

0 голосов
/ 11 июля 2020

Преобразование обеих переменных list и dict в pathos.helpers.mp.Array без промежуточного pa.helpers.mp.Manager, предложенное @Mike McKerns, привело к желаемому увеличению производительности.

...