最近看了这篇文章有一种顿悟感,想着写点总结加深理解。
如果嫌原文太长可以直接看这篇总结;不过别人咀嚼过的不一定适合你,所以还是推荐一块把原文也看了😁。
假设一个函数 foo()
中的某个操作发生了错误,并且后续操作直接或间接地依赖当前操作的正确行为;那么,不管使用何种错误处理/汇报手段,这里都需要 (1) 中止后续操作并 (2) 向上汇报错误。
这里称这种行为为 operation cancellation。
昨晚抽了个时间想修一下 anvil 的这个 issue。
根据之前的代码实现,我有 99.99% 的把握换行符被替换成 CRLF
是使用了 fileinput
原地修改了文件导致的。
那段修改的代码的一个等价实现如下:
1 | import shutil |
orig.txt
是一个模板文件,它会被拷贝到指定目录变成一个新文件 new.txt
,并修改文件内容。
通过连接池的设计了解如何回收连接到连接池以及从连接池复用连接后,可以回过头来研究一下 Redigo 支持的阻塞等待可用连接的设计与实现。
通过设置 Pool.Wait == true
之后如果当前连接池满了, Pool.Get()
不会返回连接池耗尽错误,而是阻塞在调用上,直到超时或者存在可用连接才会返回。
这个属于经典的 resource counting 问题,并且最大的 resource count 由 Pool.MaxActive
决定。
暴露给外部用户的 Pool
对象
1 | type Pool struct { |
内部维护空闲/待复用的列表数据结构 idleList
Redigo 是目前比较流行的一个 Redis Client。
虽然我个人不太喜欢它的 API 设计,奈何这个库简单易用,连公司的 redis 基础库都是在 Redigo 上做的的一个魔改。
注:原生的 Redigo 并不支持 Redis Cluster,某B站的做法是通过 side-car 的方式启动一个 redis proxy 伴生容器,屏蔽 Redis Cluster 的通信细节。
我在 Passkey Idiom 这篇文章中介绍了如何使用 passkey idiom 以及使用需要的注意项。
其中最强调的就是 Token
类的 ctor 必须同时满足 1) private access level
2) 存在显式定义;否则用户可以使用