web-dev-qa-db-fra.com

Comment laisser Pool.map prendre une fonction lambda

J'ai la fonction suivante:

def copy_file(source_file, target_dir):
    pass

Maintenant, je voudrais utiliser multiprocessing pour exécuter cette fonction à la fois:

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

Le problème est que les lambda ne peuvent pas être décapés, donc cela échoue. Quelle est la façon la plus soignée (Pythonique) de résoudre ce problème?

57
Peter Smit

Utilisez un objet fonction:

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

Pour exécuter votre Pool.map:

p.map(Copier(target_dir), file_list)
62
Fred Foo

Pour Python2.7 + ou Python3, vous pouvez utiliser functools.partial :

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

La question est un peu ancienne mais si vous utilisez toujours Python 2 ma réponse peut être utile.

L'astuce consiste à utiliser une partie du pathos projet: multiprocess fork du multiprocessing. Il supprime les limitations ennuyeuses du multiprocessus d'origine.

Installation: pip install multiprocess

Usage:

>>> 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]
3
petRUShka

Depuis this réponse, pathos vous permet d'exécuter directement votre lambda p.map(lambda x: copy_file(x,target_dir), file_list), en sauvegardant toutes les solutions/hacks

0
Rufus