字典理解本身不能并行化。这是一个如何使用的示例multiprocessing
使用 Python 2.7 的模块。
from __future__ import print_function
import time
import multiprocessing
params = [0.5]
def function(name, params):
print('sleeping for', name)
time.sleep(params[0])
return time.time()
def function_wrapper(args):
return function(*args)
names = list('onecharNAmEs')
p = multiprocessing.Pool(3)
args_generator = ((name, params) for name in names)
dictionary = dict(zip(names, p.map(function_wrapper, args_generator)))
print(dictionary)
p.close()
这适用于任何函数,尽管的限制multiprocssing module https://docs.python.org/2.7/library/multiprocessing.html#programming-guidelines申请。最重要的是,作为参数传递的类和返回值以及要并行化的函数本身必须在模块级别定义,否则(反)序列化器将找不到它们。包装函数是必要的,因为function()
有两个参数,但是Pool.map()
只能处理带有一个参数的函数(作为内置的map()
功能)。
使用 Python >3.3 可以通过使用来简化Pool
作为上下文管理器和starmap()
功能。
from __future__ import print_function
import time
import multiprocessing
params = [0.5]
def function(name, params):
print('sleeping for', name)
time.sleep(params[0])
return time.time()
names = list('onecharnamEs')
with multiprocessing.Pool(3) as p:
args_generator = ((name, params) for name in names)
dictionary = dict(zip(names, p.starmap(function, args_generator)))
print(dictionary)
这是一个更易读的版本with
block:
with multiprocessing.Pool(3) as p:
args_generator = ((name, params) for name in names)
results = p.starmap(function, args_generator)
name_result_tuples = zip(names, results)
dictionary = dict(name_result_tuples)
The Pool.map()
function 适用于具有单个参数的函数,这就是为什么Pool.starmap()
3.3 中添加了该功能。