我熟悉python的multiprocessing.Pool
以及相关的map
和map_async
来电。 map
和map_async
采用单个函数并将其应用于可迭代的参数。我想反过来 - 采用可迭代的函数并将它们应用于单个参数。这种操作有简单的标准习惯用法吗?
换句话说,我正在寻找以下内容:
from multiprocessing import Pool
pool = Pool(4)
functions = (add, subtract, divide, multiply)
args = (1, 2)
result = pool.fmap(functions, args)
print result
# [3, -1, .5, 2]
答案 0 :(得分:2)
所以..我建议使用现有的框架并将其翻转。您可以执行以下操作:
from functools import partial
def operation(args, operator):
return operator(*args)
final_op = partial(operation, [1,2])
这或多或少等同于dano的解决方案,但我发现在这里使用partial是一种真正保持通用性并避免通过索引访问参数的脆弱性的方法。它还使实际使用方面更清洁:
pool = Pool(4)
print pool.map(final_op, (add, sub, div, mul))
答案 1 :(得分:1)
你可以这样做:
from operator import add, sub, mul, div
from multiprocessing import Pool
def fmap(functionargs):
# Call function(*args) and return it
return functionargs[0](*functionargs[1])
pool = Pool(4)
functions = (add, sub, div, mul)
args = (1, 2)
result = pool.map(fmap, [(f, args) for f in functions])
print result
只需将要在迭代器中调用的函数和args传递给map
,并创建一个在worker进程中调用该函数的简单函数。