DECO——被修饰的并发

编辑:光环大数据 来源: 互联网 时间: 2017-10-31 13:41 阅读:

  DECO——被修饰的并发。DECO是简化的Python并行计算模型,它自动并行化运行Python程序,并且仅需要对现行的串行程序进行最小的改动。

使用pip安装:

pipinstalldeco

使用方法

使用DECO就像在Python编程中查找或者创建两个函数一样简便。第一个函数是我们想要并行运行的函数,该函数使用@concurrent修饰。第二个函数调用使用@concurrent修饰的函数,并且使用@synchronized修饰自己。修饰第二个函数是可选的,但是却提供了非常酷的益处。让我们看个例子:

@concurrent#Weaddthisfortheconcurrentfunctiondefprocess_lat_lon(lat,lon,data):#Doessomeworkwhichtakesawhilereturnresult@synchronized#Andweaddthisforthefunctionwhichcallstheconcurrentfunctiondefprocess_data_set(data):results=defaultdict(dict)forlatinrange(...):forloninrange(...):results[lat][lon]=process_lat_lon(lat,lon,data)returnresults

这就是要做的事情,我们只需要改动两行代码就能使程序并行化。此刻,程序将充分利用所在机器上所有CPU核,这使得程序飞速运行。

DECO做了什么

@concurrent修饰器使用multiprocessing.pool并行化了目标函数的调用

自动处理把函数参数的变化转变为基于索引的形式,这是pool所不具备的功能

@synchronized修饰器自动插入同步事件

在同步事件期间,DECO自动重构@concurrent函数调用的结果的赋值

局限

@concurrent修饰器仅仅是加速运行时间多于约1ms的那些函数

如果函数运行时间少于1ms,你的代码反而会运行的更慢

@synchronized修饰器仅仅能在“简单”函数上起作用,确信你的函数满足下面的标准:

仅是调用或者赋值@concurrent函数的结果到索引的对象,就像下面的形式:

concurrent(...)

result[key]=concurrent(…)

不要间接的读取被@concurrent函数调用而赋值的对象

工作机制

对于工作机制的深层次讨论,我们写了一篇论文(可以在这里找到)。

做一个概括的话,DECO是一个对Python的multiprocessing.pool的灵巧封装。当@concurrent被应用到一个函数时,它取代了pool.apply_async的调用,而且当参数传递给pool.apply_async的时候,DECO通过代理替换了索引的可变对象,允许DECO检测和同步这些对象的变化。这些调用的结果可以通过在并行函数上调用wait()来获取,这唤起了一个同步事件。通过对调用@concurrent函数的这些函数使用@synchronized修饰器,这些事件可以在你的代码中自动放置。另外,当使用@synchronized的时候,你可以直接把索引的可变对象赋值给并行函数运行的结果,这些赋值被DECO重构以在下一次同步事件的时候自动发生。所有的这些意味着在多数情况下,使用DECO的并行编程看起来就像简单的串行编程一样简单。

 

  Python培训Python培训班Python培训机构,就选光环大数据!

  还不够过瘾?想学习更多?点击 http://hadoop.aura.cn/python/ 进行Python学习!


大数据培训、人工智能培训、Python培训、大数据培训机构、大数据培训班、数据分析培训、大数据可视化培训,就选光环大数据!光环大数据,聘请专业的大数据领域知名讲师,确保教学的整体质量与教学水准。讲师团及时掌握时代潮流技术,将前沿技能融入教学中,确保学生所学知识顺应时代所需。通过深入浅出、通俗易懂的教学方式,指导学生更快的掌握技能知识,成就上万个高薪就业学子。 更多问题咨询,欢迎点击------>>>>在线客服

你可能也喜欢这些

在线客服咨询

领取资料

X
立即免费领取

请准确填写您的信息

点击领取
#第三方统计代码(模版变量) '); })();
'); })();