我有以下功能:
def copy_file(source_file, target_dir):
pass
现在我想使用multiprocessing
一次执行此功能:
p = Pool(12)
p.map(lambda x: copy_file(x,target_dir), file_list)
问题是,lambda不能被腌制,所以这失败了。解决这个问题最简洁(pythonic)的方法是什么?
答案 0 :(得分:60)
使用功能对象:
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)
答案 1 :(得分:32)
For Python2.7+或Python3,您可以使用functools.partial:
import functools
copier = functools.partial(copy_file, target_dir=target_dir)
p.map(copier, file_list)
答案 2 :(得分:3)
问题有点旧,但如果你仍然使用Python 2,我的答案可能会有用。
Trick是使用pathos项目的一部分: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]
答案 3 :(得分:0)
从this回答,悲情让你直接运行你的lambda p.map(lambda x: copy_file(x,target_dir), file_list)
,保存所有的变通方法/黑客