Как пустить бассейн.карта взять лямбда-функцию


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

def copy_file(source_file, target_dir):
    pass

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

p = Pool(12)
p.map(lambda x: copy_file(x,target_dir), file_list)
Проблема в том, что лямбды нельзя замариновать, поэтому это не удается. Каков самый аккуратный (питонский) способ исправить это?
4 37

4 ответа:

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

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)

Для Python2. 7+ или Python3 можно использовать функции .частичное :

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

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

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

Установка: 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]

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