DECO——被修饰的并发
使用DECO就像在Python编程中查找或者创建两个函数一样简便。第一个函数是我们想要并行运行的函数,该函数使用@concurrent修饰。第二个函数调用使用@concurrent修饰的函数,并且使用@synchronized修饰自己。修饰第二个函数是可选的,但是却提供了非常酷的益处。让我们看个例子:
@concurrent # We add this for the concurrent function
def process_lat_lon(lat, lon, data):
#Does some work which takes a while
return result
@synchronized # And we add this for the function which calls the concurrent function
def process_data_set(data):
results = defaultdict(dict)
for lat in range(...):
for lon in range(...):
results[lat][lon] = process_lat_lon(lat, lon, data)
return results
这就是要做的事情,我们只需要改动两行代码就能使程序并行化。此刻,程序将充分利用所在机器上所有CPU核,这使得程序飞速运行。
局限
@concurrent修饰器仅仅是加速运行时间多于约1ms的那些函数
如果函数运行时间少于1ms,你的代码反而会运行的更慢
@synchronized修饰器仅仅能在“简单”函数上起作用,确信你的函数满足下面的标准:
仅是调用或者赋值@concurrent函数的结果到索引的对象,就像下面的形式:
concurrent(...)
result[key] = concurrent(…)
不要间接的读取被@concurrent函数调用而赋值的对象