DECO——被修饰的并发

2016-05-27  本文已影响0人  roger_lyb

使用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函数调用而赋值的对象

上一篇下一篇

猜你喜欢

热点阅读