Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将python函数列表异步应用于单个参数_Python_Multithreading_Asynchronous_Multiprocessing - Fatal编程技术网

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

将python函数列表异步应用于单个参数,python,multithreading,asynchronous,multiprocessing,Python,Multithreading,Asynchronous,Multiprocessing,我熟悉python的多处理.Pool以及相关的map和map\u async调用map和map\u async使用单个函数并将其应用于参数的iterable。我想做相反的事情——取一个iterable函数,并将它们应用于一个参数。这种操作有没有简单的标准习惯用法 换言之,我正在寻找以下内容: from multiprocessing import Pool pool = Pool(4) functions = (add, subtract, divide, multiply) args = (

我熟悉python的
多处理.Pool
以及相关的
map
map\u async
调用
map
map\u async
使用单个函数并将其应用于参数的iterable。我想做相反的事情——取一个iterable函数,并将它们应用于一个参数。这种操作有没有简单的标准习惯用法

换言之,我正在寻找以下内容:

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]
from functools import partial

def operation(args, operator):
    return operator(*args)
final_op = partial(operation, [1,2])

所以。。我建议使用现有的框架,并将其彻底颠覆。您可以执行以下操作:

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]
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))

您可以这样做:

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

只需将要在迭代器中调用的函数和参数传递到
映射
,并创建一个简单的函数,在辅助进程中调用该函数。

是否尝试将
子类化并创建一个新方法,或者一个单独的函数就足够了?两者都可以——我只是在寻找一个干净的解决方案,来解决我所期望的一个相当普通的操作。这就是我所寻找的那种干净的、惯用的解决方案。还有,你好,斯莱特。@Madison可能很乐意帮忙:)告诉他们我打招呼。你不能用
lambda
打招呼。您将得到一个
PicklingError
。您必须创建一个顶级函数:
def operation(args,operator):return operator(*args)
。不过,使用分部比列表更好。