Как пустить бассейн.карта взять лямбда-функцию
У меня есть следующая функция:
def copy_file(source_file, target_dir):
pass
Теперь я хотел бы использовать multiprocessing
для выполнения этой функции сразу:
p = Pool(12)
p.map(lambda x: copy_file(x,target_dir), file_list)
Проблема в том, что лямбды нельзя замариновать, поэтому это не удается. Каков самый аккуратный (питонский) способ исправить это?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)
напрямую, сохраняя все обходные пути / хаки