Python многопроцессорная обработка: примените pool.map к методам заданных c объектов - PullRequest
0 голосов
/ 11 января 2020

Отлично работает следующее параллельное выполнение функции: из многопроцессорного импорта Пул из случайного импорта randrange

def triple(number):
    return number * 3

if __name__ == '__main__':
    numbers = [5, 10, 20]
    pool = Pool(processes=3)
    print(pool.map(triple, numbers))

Но как я могу получить то же самое, всегда вызывая один и тот же метод в списке объектов, то есть когда функция является методом для некоторого класса объектов:

from multiprocessing import Pool
from random import randrange


class RandomNumber():
    def __init__(self):
        self.no = randrange(100)

    def triple(self, *args, **kwargs):
        print(triple(self.no))
        return triple(self.no)


if __name__ == '__main__':
    # but how can I always call the same method on an object
    numbers = [RandomNumber() for m in range(0, 3)]
    # e.g. here on every random number within the list
    # call numbers[0].triple(), numbers[1].triple() ...
    # paralelly?

Проблема в том, что я привязан к указанным c объектам и не могу просто использовать функцию ..

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 11 января 2020

Вы можете деформировать этот метод с помощью функции:

def triple_warpper(random_number: RandomNumber):
    return random_number.triple()

if __name__ == '__main__':
    numbers = [RandomNumber() for m in range(0, 3)]
    pool = Pool(processes=3)
    print(pool.map(triple_warpper, numbers))
0 голосов
/ 11 января 2020

Вот способ с использованием __call__ метода:

class RandomNumber:

    def __call__(self, *args, **kwargs):
        r = randrange(100)
        return r

if __name__ == '__main__':

    r = RandomNumber()
    numbers = [x for x in range(0, 10)]
    pool = Pool(processes=3)
    print(pool.map(r, numbers))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...