Как позволить 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)
Проблема заключается в том, что лямбда не может быть маринована, поэтому это терпит неудачу. Какой самый опрятный (питонический) способ исправить это?
Ответы
Ответ 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)
напрямую, сохраняя все обходные пути/хаки