IT之家8月22日消息,Meta日前宣布将在Python中加入ImmortalObjects,使得对象可以绕过参照计数检查,成为在执行时持续存活的“不朽对象”,从而提高内存的使用效率,并有助于解除Python语言本身在平行运算上的局限。
IT之家发现,Meta使用Python网页框架Django开发Instagram前端,并且使用多程序架构以及Python函数库asyncio,以达到每个程序并行处理的目标,但因为Instagram前端无论是在业务逻辑还是处理的请求量层面,规模都十分庞大,开发者当下应用的这个方法,反而造成了对内存的大量需求,从而导致系统出现一系列性能障碍。
▲图源Meta提出的PEP-,目前已经被采纳随着系统运作,每个服务器程序的私有内存使用增加,而共享内存减少,这样的现象造成内存效率低下。
开发人员分析发现,即便许多Python对象在整个执行时不可变,但是Python的参照计数和垃圾回收机制仍然会试图管理并修改这些对象,在每次读取和垃圾回收周期仍会执行写入时复制(Copy-On-Write,COW)步骤,使得原本共享的内存分页转为私有,共享内存效率也便因此减少,从而导致不必要的CPU和内存成本开销。
▲使用ImmortalObjects可提升内存和CPU效率当下Meta便是为了解决这个问题,从而宣布将在Python中加入ImmortalObjects,ImmortalObjects在对象的参照计数字段中,标记特殊值以创建“不朽对象”,也就是“核心对象状态永远不会改变的对象”,Runtime会知道什么时候可以或是不可以改变参照计数字段和垃圾回收头。
在Instagram前端中,开发者原先通过“减少写入时复制操作”,以提高内存和CPU效率,当下随着ImmortalObjects的加入,Instagram前端便可以通过增加共享内存使用量,来大幅减少私有内存的使用。
由于ImmortalObjects可以跨线程共享对象,不再需要GIL(GlobalInterpreterLock)达到线程安全性,Meta认为,这项功能有望促进Python语言发展,且由于ImmortalObjects保证堆对象真正的不可变性,因此也能够解除Python在并行运算的一系列限制。