将python函数列表异步应用于单个参数

时间:2014-06-16 20:08:35

标签: python multithreading asynchronous multiprocessing

我熟悉python的multiprocessing.Pool以及相关的mapmap_async来电。 mapmap_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]

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进程中调用该函数的简单函数。