介绍

urllib3._collections.py::RecentlyUserContainer类,是一个线程安全的Dict类容器,用来维护一定数量(maxsize)的Key-Value映射, 当数量超出,会删除最近最少使用的key。该类实际用在PoolManager中存储Session中一定连接数量的连接池,当连接数超出时,会自动删除最早保存的连接,并且查找连接的时间复杂度是O(1)。

原理

其原理是通过有序字典(OrderedDict)保存Key的插入顺序,但Key的数量超出阈值时,删除最早插入的Key

from collections import OrderedDict
from threading import RLock class RecentlyUserContainer:
def __init__(self, maxsize):
self._maxsize = maxsize
self._container = OrderedDict()
self.lock = RLock() def __getitem__(self, key):
with self.lock:
# 注意 这里先取出再插入的目的是更新该Key的顺序,即它最近被访问过
item = self._container.pop(key)
self._container[key] = item
return item def __setitem__(self, key, value):
with self.lock:
self._container[key] = value
if len(self._container) > self._maxsize:
# 驱逐出最早插入的Key
key, _ = self._container.popitem(last=False)
print(f"{key} is evicted")

使用

>>> pool = RecentlyUserContainer(3)
>>> pool["https://www.1.com"] = "conn1"
>>> pool["https://www.2.com"] = "conn2"
>>> pool["https://www.3.com"] = "conn3"
>>> pool["https://www.4.com"] = "conn4"
www.1.com is evicted
>>> pool._container
OrderedDict([('https://www.2.com', 'conn2'),
('https://www.3.com', 'conn3'),
('https://www.4.com', 'conn4')])

最新文章

  1. tcpdump的简单使用
  2. storm启动过程之源码分析
  3. redis中setbit的用法
  4. UIScrollView
  5. python笔记-python编程优化:常用原则和技术介绍
  6. IntelliJ_设置
  7. poj 3122 (二分查找)
  8. HTML5 随音乐节奏变化的频谱图动画
  9. java经验总结二:ORA-08103: 对象不再存在
  10. 移动网络山寨版(OpenBTS)【2】频段的故事
  11. ASP.NET成员资格与角色管理配置内容
  12. linux $ 类型变量 及Makefile 中 $ 类型变量的含义
  13. 一行命令创建 http-server
  14. P3
  15. Compass 更智能的搜索引擎(3)--高亮,排序,过滤以及各种搜索
  16. 初识Java作业
  17. ubuntu16.04 安装NVIDIA和CUDA9.2 cudNN7.1
  18. Mybatis批量更新报错com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException
  19. Android组件--碎片(fragment)
  20. WebGl 缩放(矩阵变换)

热门文章

  1. 超详细!搭建本地大数据研发环境(16G内存+CDH)
  2. debian 9 调节亮度
  3. CentOS 7命令行修改网卡名称
  4. [POI2008]PER
  5. URL 参数为sql 有空格 的解决办法
  6. git学习心得之git跨分支提交代码
  7. js学习笔记之正则
  8. 新一代垃圾回收器ZGC的探索与实践
  9. 百度nlp api接口测试
  10. CreatFile打开驱动失败