如果您的函数是IO绑定的(这意味着它们花费大部分时间等待某个IO操作完成),那么使用多个线程可能是一个公平的解决方案。在
如果您的函数是CPU限制的(意味着它们将大部分时间用于实际的计算工作),那么多个线程将不会对您有所帮助,除非您使用的python实现没有global interpreter lock。在
这里可以使用多个python进程。最简单的解决方案是multiprocessing模块。下面是一个例子:#!/usr/bin/env python3
from multiprocessing import Pool
from functools import reduce
def a(x):
return reduce(lambda memo, i: memo + i, x)
def b(x):
return reduce(lambda memo, i: memo - i, x)
def c(x):
return reduce(lambda memo, i: memo + i**2, x)
my_funcs = [a, b, c]
#create a process pool of 4 worker processes
pool = Pool(4)
async_results = []
for f in my_funcs:
#seconds parameter to apply_async should be a tuple of parameters to pass to the function
async_results.append(pool.apply_async(f, (range(1, 1000000),)))
results = list(map(lambda async_result: async_result.get(), async_results))
print(results)
这种方法允许您并行地利用所有的CPU能力:只需选择一个与环境中CPU数量相匹配的池大小。这种方法的局限性是所有函数都必须是pickleable。在