Pond 介绍

Pond 是一个 Python 中高效的通用对象池,具有性能好、内存占用小、命中率高的特点。基于近似统计的根据频率自动回收的能力,能够自动调整每个对象池的空闲对象数量。

因为目前 Python 目前没有比较好的、测试用例完备、代码注释完备、文档完善的对象池化库,同时目前的主流对象池库也没有比较智能的自动回收机制。

Pond 可能是 Python 中第一个社区公开的测试用例完整,覆盖率 90% 以上、代码注释完备、文档完善的对象池化库。

Pond 灵感来自于 Apache Commons Pool、Netty Recycler、HikariCP、Caffeine,集合了多家的优点。

其次 Pond 通过使用近似计数的方式以极小的内存空间统计每个对象池的使用频率,并且自动回收。

流量较为随机平均的情况下,默认策略和权重可以降低 48.85% 内存占用,借取命中率 100%。

流量较为符合 2/8 定律的情况下,默认策略和权重可以降低 45.7% 内存占用, 借取命中率 100%。

设计概述

Pond 主要由 FactoryDict、Counter、PooledObjectTree 三部分以及一个单独的回收线程构成。

FactoryDict

使用 Pond 需要实现对象工厂 PooledObjectFactory,PooledObjectFactory 提供对象的创建、初始化、销毁、验证等操作,由 Pond 调用。

所以为了让对象池支持存放完全不同的对象,Pond 使用了一个字典来记录每个工厂类的名称和自己实现的工厂类的实例化对象。

每个 PooledObjectFactory 应该具备创建对象、销毁对象、验证对象是否还可用、重置对象四个功能。

比较特别的是 Pond 支持自动重置对象,因为某些场景下可能会存在对象中要先赋值进行传递,传递完又被回收的情况,为了避免污染建议这种场景下无比实现这个功能。

IT问答库http://www.mobiletrain.org/qa/

Counter

Counter 中保存了一个近似计数器。

PooledObjectTree

PooleedObjectTree 是个字典,每个 key 对应着一个先进先出的队列,这些队列都是线程安全的。

每个队列中保存着多个 PooleedObject。PooledObejct 保存了创建时间、最后借出的时间以及实际需要的对象。

线程安全

Pond 的借用和回收都是线程安全的。Python 的 queue 模块提供了一个适用于多线程编程的先进先出(FIFO)数据结构。它可以用来安全地在生产者和消费者线程之间传递消息或其他数据。

锁是调用者来处理的,所有多个线程能够安全且容易的使用同样的 Queue 实例工作。而 Pond 的借用和回收都是在操作 queue,所以基本可以认为是线程安全的。

借出机制

在使用 Pond 借出一个对象时,会先检查想要借出的对象的种类是否已经在 PooledObjectTree 存在,如果存在会检查这个对象的对象池是否为空,如果为空会创建一个新的。

如果对象池中有多余的对象,会利用 queue 弹出一个对象并验证这个对象是否可用。如果不可用会自动调用所属的 Factory 清理销毁该对象,同时清理它在 Python 中的 GC 计数,让它更快被 GC 回收,不断拿取下一个直至有可用的。

如果这个对象可用,则会直接返回。当然无论是从对象池中取出对象还是新创建了一个对象,都会利用 Counter 增加一个计数。

回收机制

回收一个对象时会判断目标对象池存不存在,如果存在会检查对象池是否已经满了,满了的话会自动销毁要归还的这个对象。

然后会检查这个对象是否已经被借出太长时间,如果超过了配置的最长时间同样会被清理掉。

自动回收

自动回收时每隔一段时间,默认是 300 s,就会执行一次。自动清理不经常使用的对象池中的对象。

Python学习中的Pond是什么相关推荐

  1. python教程400集笔记,Python学习中的笔记--集合相关,python笔记--集合

    Python学习中的笔记--集合相关,python笔记--集合 集合的基本操作 一.可修改的集合set 创建集合 var = set() var = {'a','b','c','d'} 成员检测 va ...

  2. python实践意义_在Python学习中过程比结果更有意义

    原标题:在Python学习中过程比结果更有意义 如果人生是一趟旅行,那我们最应该关注的是沿途的风景而不是最终的目的地.对于学习Python而言,提升自身能力.提高处理问题的速度.培养自己勤思考.善于思 ...

  3. python学习中符号报错的一点总结

    初次接触python,开始写简单代码,一边看教程老师写,一边自己写,明明觉得跟老师写的一样,为神马总是报错SyntaxError: invalid syntax 各种找不到原因,崩溃中--难道真的是从 ...

  4. python烦恼_老男孩教育教你,如何摆脱Python学习中的烦恼?

    Python虽然在大家看来是一门非常简单的计算机语言,也是很多人的首要选择,但是真正的学习起来,让人非常的烦恼,甚至学习过没几天,不少人觉得Python太难,想要放弃学习,我想很多人都会遇到这样的问题 ...

  5. Python学习中的无效语法常见原因和解决办法分析

    Python以其简单的语法而闻名.然而,当您第一次学习Python时,或者当您具有另一种编程语言的坚实背景时,您可能会遇到一些Python不允许的事情.如果您在尝试运行Python代码时收到过Synt ...

  6. idea的jsp如何显示语法高亮_如何啃下Python学习中的三块硬骨头?

    Python 根式字 [51CTO.com快译]众所周知,作为一门开源的高级编程语言,Python的用途十分广泛.它可以被用于不同的应用场景中,包括:开发基于桌面和Web的应用程序,分析访问数据,开发 ...

  7. python程序设计心得体会感想-从Python学习中得到的一点感悟

    我们经常性的使用语言,比如被我们忽略的人类语言.语言作为沟通的工具,它的功用再清楚不过了,不一样的是,程序设计语言是人和计算机之间沟通的工具.可以说,冯诺依曼计算机的五大部件决定了计算机的文化和程序语 ...

  8. Python学习中的错误总结

    终于下定决心认真学习Python了,并且发誓要学精通,根据费曼学习法则,我准备把入门第一天起的所有错误和学习感悟记录下来,以便后续复习和提高. 使用资料https://github.com/jackf ...

  9. python学习中的bug

    1.在pycharm的terminal中的python工程目录下update pip失败,但是在cmd中为什么就可以.' 转载于:https://www.cnblogs.com/Robin008/p/ ...

最新文章

  1. Node.js实现Excel转JSON
  2. Zookeeper原理和实战开发经典视频教程 百度云网盘下载
  3. 面临重重挑战 华为造车之路任重道远
  4. 初学者,你应当如何学习C++以及编程-转
  5. Python:Numpy库中的invert()函数的用法
  6. 小话设计模式五:模板方法模式
  7. js excel 矫正
  8. GridView(网格视图)+MotionEvent(触控事件)实现可以拖动排序的网格图
  9. 基于Matlab的随机森林算法实现(附算法介绍及代码详解)
  10. C# 添加水印图片、文字、缩略图处理
  11. 两轮自平衡机器人(一)---Simscape物理建模
  12. [AFCTF2018]可怜的RSA
  13. 苹果手机的siri在哪里_苹果手机Siri功能的设置和使用 原来是这样的
  14. 合理应用对阿斯克码值进行类型转换(尽量别用强制类型转换)
  15. MATLAB中对小数进行取整处理
  16. Blog5 无监督深度关键短语生成——关键代码分析3
  17. (15.1.8)2015互联网女皇报告:互联网仍在缓慢增长
  18. 2018 Benelux Algorithm Programming Contest (BAPC 18) J-Janitor Troubles(计算几何公式)
  19. 信息安全密码学:RSA密码体制
  20. 如何修改word2007作者

热门文章

  1. 芯片封装测试流程详解
  2. eclipse运行出现an error has occur.see the log file解决办法
  3. 基于51单片机的宠物自动猫粮狗粮喂养机proteus仿真原理图PCB
  4. 2021-5-8字符串作业
  5. java spark 二进制_spark数据源操作
  6. 第十二篇.最重要的合并函数Con介绍
  7. WiFi_WiFi6和WiFi5区别
  8. 苹果手机语音备忘录在哪_苹果手机删除的备忘录怎样找回?方法简单,3秒学会!赶紧来看...
  9. 简单网页制作代码 HTML+CSS+JavaScript香港美食(8页)
  10. 2021年伊宁三中高考成绩查询,伊宁三中2015高考榜.doc