Python将引入不变对象等本周互联网大厂博文推荐

从最近的科技公司工程博客中精选博文:

[Meta] 介绍 Python 的 Immortal 对象 
Instagram 向 Python 引入了 Immortal Objects – PEP-683。现在,对象可以绕过引用计数检查并在运行时的整个执行过程中存活,从而为真正的并行性解锁了令人兴奋的途径。

在 Meta,我们使用 Python (Django) 作为 Instagram 中的前端服务器。为了处理并行性,我们依靠多进程架构以及 asyncio 来实现每进程并发。然而,我们的规模——无论是业务逻辑还是处理的请求量——可能会导致内存压力增加,从而导致效率瓶颈。

为了减轻这种影响,我们依靠预分叉 Web 服务器架构来缓存尽可能多的对象,并让每个单独的进程通过共享内存将它们用作只读结构。虽然这很有帮助,但经过仔细检查,我们发现进程的私有内存使用量随着时间的推移而增加,而共享内存却减少了。

通过分析 Python 堆,我们发现虽然大多数 Python 对象实际上是不可变的,并且在运行时的整个执行过程中都存在,但最终仍然通过引用计数和垃圾收集 (GC) 操作来修改这些对象,这些操作会改变对象的每个读取和 GC 周期上的元数据 - 因此,在服务器进程上 触发写入时复制。

复制对写入的影响是增加私有内存并减少主进程的共享内存。

共享对象的状态突变问题是 Python 运行时工作原理的核心。鉴于它依赖于引用计数和循环检测,运行时需要修改对象的核心内存结构,这是该语言需要全局解释器锁(GIL)的原因之一。

为了解决这个问题,我们引入了Immortal 对象 - PEP-683。这通过在对象的引用计数字段中标记特殊值来创建一个不朽对象(核心对象状态永远不会改变的对象)。它允许运行时知道何时可以改变引用计数字段和 GC 标头。

标准物体与Immortal 物体的比较。使用标准对象,用户可以保证它不会改变其类型和/或其数据。不朽性增加了额外的保证,即运行时不会修改引用计数或 GC 标头(如果存在),从而实现完全的对象不变性。


[Depop] 特性驱动的 ML :
在 Depop,我们在各种有影响力的用例中利用机器学习,包括搜索、推荐、欺诈检测等。机器学习周期涉及几个步骤:

  1. 彻底了解当前的业务问题。
  2. 精心设计 ML功能来为我们的模型提供支持
  3. 使用历史数据评估模型的性能以确保其准确性。
  4. 将成功的模型部署到生产中。

事实证明,实现生产级 ML 功能并不容易!这就是为什么我们与Tecton合作提供特征存储,用于存储数据科学家开发的特征并将这些特征提供给我们的生产模型。
与开源工具 Feast 相比,Tecton 实现了一系列增值功能(Tecton vs Feast)。Tecton 处理创建这些特征所涉及的整个操作过程,以及管理作业以确保我们的特征定期更新为最新数据。

其他: