Подтвердить что ты не робот

Как позволить Pool.map использовать функцию лямбда

У меня есть следующая функция:

def copy_file(source_file, target_dir):
    pass

Теперь я хотел бы использовать multiprocessing для выполнения этой функции сразу:

p = Pool(12)
p.map(lambda x: copy_file(x,target_dir), file_list)

Проблема заключается в том, что лямбда не может быть маринована, поэтому это терпит неудачу. Какой самый опрятный (питонический) способ исправить это?

4b9b3361

Ответ 1

Используйте объект функции:

class Copier(object):
    def __init__(self, tgtdir):
        self.target_dir = tgtdir
    def __call__(self, src):
        copy_file(src, self.target_dir)

Чтобы запустить Pool.map:

p.map(Copier(target_dir), file_list)

Ответ 2

Ответ был поражен, потому что этот фактически не работает в Python2, поскольку объекты functools.partial (в Python2) не могут быть отсортированы.

Однако объекты

functools.partial были сделаны picklable в Python3, поэтому это решение действительно работает.


Вы можете использовать functools.partial:

import functools
copier=functools.partial(copy_file,target_dir=target_dir)
p.map(copier,file_list)

Забастовкa >

Ответ 3

Вопрос немного старый, но если вы все еще используете Python 2, мой ответ может быть полезен.

Trick должен использовать часть pathos project: multiprocess для многопроцессорной обработки. Это избавляет от раздражающего ограничения оригинального многопроцесса.

Установка: pip install multiprocess

Использование:

>>> from multiprocess import Pool
>>> p = Pool(4)
>>> print p.map(lambda x: (lambda y:y**2)(x) + x, xrange(10))
[0, 2, 6, 12, 20, 30, 42, 56, 72, 90]

Ответ 4

Из этого ответа, пафос позволяет вам запускать ваш лямбда p.map(lambda x: copy_file(x,target_dir), file_list) напрямую, сохраняя все обходные пути/хаки