当前位置: 首页 > article >正文

Python 上下文管理器深度指南:从协议原理到生产级实战

Python 上下文管理器深度指南从协议原理到生产级实战管理文件句柄、数据库事务、临时环境变量——为什么你的代码需要with一、开篇一个差点造成线上事故的故事去年我们团队的一个服务出现了一个诡异的数据库连接泄漏问题。症状很隐蔽服务运行几个小时后新请求全部超时。排查下来原因非常简单——某个同事在一个异常分支里手动打开了一次数据库连接但忘了关defget_user(user_id):connget_db_connection()userconn.execute(SELECT * FROM users WHERE id %s,(user_id,)).fetchone()ifuserisNone:returnNone# ⚠️ conn 从未被关闭conn.close()returnuser每次查询一个不存在的用户就会泄漏一个连接。量一大连接池就被耗尽了。修复方式极其简单——改用with语句defget_user(user_id):withget_db_connection()asconn:userconn.execute(SELECT * FROM users WHERE id %s,(user_id,)).fetchone()returnuser# 不管走哪条分支conn 都会自动关闭就是这一个with解决了困扰我们两天的线上问题。这个故事引出了今天的主题Python 上下文管理器Context Manager。它不只是语法糖而是一套完整的资源管理协议。理解它的原理能让你在文件操作、数据库事务、临时配置切换、线程锁管理等场景下写出更健壮的代码。二、基础回顾上下文管理器协议是什么Python 的上下文管理器协议定义了两个核心方法classContextManager:def__enter__(self):进入 with 块时调用返回值绑定到 as 后的变量# 初始化资源returnresourcedef__exit__(self,exc_type,exc_val,exc_tb):退出 with 块时调用无论是否发生异常# 释放资源# 返回值决定是否抑制异常后面重点讲returnFalsewith语句的执行流程如下with expression as variable: body等价于managerexpression variablemanager.__enter__()try:bodyexcept:ifnotmanager.__exit__(*sys.exc_info()):raiseelse:manager.__exit__(None,None,None)三个关键点__enter__在with块执行前调用返回值赋给as后的变量__exit__在with块执行后调用无论是否发生异常__exit__的返回值决定了异常是否继续传播这是一个精妙的设计三、实现方式一__enter__/__exit__类这是最基础、最显式的实现方式。适合需要维护复杂状态的场景。3.1 文件操作——标准库的做法Python 内置的open()返回的文件对象本身就实现了上下文管理器协议# 这段代码大家每天都在写withopen(data.txt,r,encodingutf-8)asf:contentf.read()# 走到这里文件已经被自动关闭即使中间抛异常3.2 数据库事务管理器这是生产环境中最常见的使用场景之一classDatabaseTransaction: 数据库事务上下文管理器 行为规则 - 正常退出 → COMMIT - 发生异常 → ROLLBACK - 无论怎样 → 关闭连接 def__init__(self,db_url):self.db_urldb_url self.connNoneself.cursorNonedef__enter__(self):importpsycopg2 self.connpsycopg2.connect(self.db_url)self.cursorself.conn.cursor()returnself.cursor# 使用方直接拿到 cursor 操作数据库def__exit__(self,exc_type,exc_val,exc_tb):try:ifexc_typeisNone:# 无异常 → 提交事务self.conn.commit()else:# 有异常 → 回滚事务self.conn.rollback()print(f事务回滚原因{exc_val})finally:# 无论如何都关闭连接ifself.cursor:self.cursor.close()ifself.conn:self.conn.close()returnFalse# 不抑制异常让它继续传播# 使用方式try:withDatabaseTransaction(postgresql://localhost/mydb)ascur:cur.execute(UPDATE accounts SET balance balance - 100 WHERE id 1)cur.execute(UPDATE accounts SET balance balance 100 WHERE id 2)# 如果上面任何一步失败整个事务自动回滚exceptExceptionase:print(f转账失败:{e})3.3 临时环境变量另一个高频场景——在测试或配置切换中临时修改环境变量importosclassTemporaryEnv:临时修改环境变量退出 with 块后自动恢复def__init__(self,**kwargs):self.overrideskwargs self.originals{}def__enter__(self):forkey,valueinself.overrides.items():# 保存原始值如果有的话self.originals[key]os.environ.get(key)# 设置新值os.environ[key]str(value)returnselfdef__exit__(self,exc_type,exc_val,exc_tb):forkey,originalinself.originals.items():iforiginalisNone:# 原本不存在删除os.environ.pop(key,None)else:# 恢复原值os.environ[key]originalreturnFalse# 使用方式print(os.environ.get(API_KEY))# NonewithTemporaryEnv(API_KEYtest-key-123,DEBUGtrue):print(os.environ.get(API_KEY))# test-key-123print(os.environ.get(DEBUG))# true# 在这个代码块内所有读取这两个环境变量的代码都会拿到临时值print(os.environ.get(API_KEY))# None —— 自动恢复四、实现方式二contextlib.contextmanager装饰器类的方式虽然清晰但每次都要写一个类对于简单场景来说太重了。Python 提供了一个更轻量的方案——contextlib.contextmanager装饰器。4.1 基本原理它利用生成器的特性将一个函数劈成两半fromcontextlibimportcontextmanagercontextmanagerdefmy_context():# __enter__ 部分 # yield 之前的所有代码相当于 __enter__resourceacquire_resource()yieldresource# yield 的值绑定到 as 后的变量# __exit__ 部分 # yield 之后的所有代码相当于 __exit__release_resource(resource)4.2 用生成器重写之前的三个场景文件操作fromcontextlibimportcontextmanagercontextmanagerdefmanaged_open(filepath,moder,encodingutf-8):手动实现一个文件管理器fopen(filepath,mode,encodingencoding)try:yieldffinally:f.close()print(f文件{filepath}已关闭)withmanaged_open(data.txt,w)asf:f.write(Hello, Context Manager!)# 输出文件 data.txt 已关闭数据库事务contextmanagerdefdb_transaction(db_url):数据库事务 —— 用生成器实现importpsycopg2 connpsycopg2.connect(db_url)cursorconn.cursor()try:yieldcursor conn.commit()exceptException:conn.rollback()raise# 重新抛出保持异常传播finally:cursor.close()conn.close()# 使用方式与类版本完全一致withdb_transaction(postgresql://localhost/mydb)ascur:cur.execute(UPDATE accounts SET balance balance - 100 WHERE id 1)cur.execute(UPDATE accounts SET balance balance 100 WHERE id 2)临时环境变量contextmanagerdeftemp_env(**kwargs):临时环境变量 —— 生成器版本代码量减半originals{k:os.environ.get(k)forkinkwargs}try:os.environ.update({k:str(v)fork,vinkwargs.items()})yieldfinally:fork,vinoriginals.items():ifvisNone:os.environ.pop(k,None)else:os.environ[k]v五、核心追问__exit__返回值如何影响异常传播这是上下文管理器协议中最容易被忽视、也最精妙的设计。5.1 规则__exit__方法的返回值遵循一条简单但关键的规则__exit__返回值行为False或不返回/返回None异常正常传播调用方会收到异常True异常被抑制with语句之后的代码正常执行调用方不会收到异常5.2 演示——返回 False默认行为classFailOnError:def__enter__(self):print(进入上下文)returnselfdef__exit__(self,exc_type,exc_val,exc_tb):print(f退出上下文异常:{exc_val})returnFalse# 异常继续传播try:withFailOnError():raiseValueError(出错了!)exceptValueError:print(异常传播到了外部被捕获)# 输出# 进入上下文# 退出上下文异常: 出错了!# 异常传播到了外部被捕获5.3 演示——返回 True抑制异常classSuppressErrors:def__enter__(self):print(进入上下文)returnselfdef__exit__(self,exc_type,exc_val,exc_tb):ifexc_typeisValueError:print(f已抑制 ValueError:{exc_val})returnTrue# 告诉 Python这个异常我处理了别传播returnFalse# 其他类型的异常正常传播withSuppressErrors():raiseValueError(这个异常会被吞掉)print(代码继续执行——异常被抑制了!)# 输出# 进入上下文# 已抑制 ValueError: 这个异常会被吞掉# 代码继续执行——异常被抑制了!5.4 标准库中的应用contextlib.suppressPython 标准库正是利用这个机制实现了contextlib.suppressfromcontextlibimportsuppress# 等价于 try/except FileNotFoundError: pass但语义更清晰withsuppress(FileNotFoundError):os.remove(temp.txt)# 文件不存在也不报错它的实现原理非常简洁classsuppress:def__init__(self,*exceptions):self._exceptionsexceptionsdef__enter__(self):returnselfdef__exit__(self,exc_type,exc_val,exc_tb):ifexc_typeisnotNoneandissubclass(exc_type,self._exceptions):returnTrue# 抑制指定类型的异常returnFalse5.5 ⚠️ 危险操作不要轻易返回 TrueclassDangerousSuppressor:def__exit__(self,exc_type,exc_val,exc_tb):returnTrue# 无条件抑制所有异常 ← 极其危险withDangerousSuppressor():raiseRuntimeError(致命错误!)# 异常被默默吞掉了程序继续运行在一个不确定的状态print(一切看起来正常...但其实已经出问题了)⚠️警示无条件返回True是一种异常反模式。它让错误在系统中无声传播最终导致更难排查的 bug。除非你明确知道自己在做什么比如contextlib.suppress否则永远让__exit__返回False。5.6contextmanager中的异常处理使用contextlib.contextmanager时异常处理需要特别注意yield的位置contextmanagerdefsafe_operation():print(准备资源)try:yieldexceptExceptionase:print(f捕获到异常:{e})# ⚠️ 注意这里如果不 raise异常就被抑制了# 如果 raise异常继续传播raisefinally:print(清理资源)# 异常传播try:withsafe_operation():raiseValueError(测试异常)exceptValueError:print(异常传播到了外部)# 输出# 准备资源# 捕获到异常: 测试异常# 清理资源# 异常传播到了外部关键区别contextmanager中的行为等价的类实现yield之后不捕获异常__exit__返回Falseyield用try/except捕获后不raise__exit__返回Trueyield用try/except捕获后raise__exit__返回False六、两种方式的选择指南到此我们已经掌握了两种实现方式。那实际开发中该如何选择维度__enter__/__exit__类contextmanager代码量较多需要定义类较少一个函数搞定状态管理适合维护复杂状态多个属性适合简单场景异常控制精确控制通过返回值通过try/except控制可读性逻辑分散在两个方法线性阅读上下文完整可复用性适合框架级组件适合业务级工具典型场景数据库连接池、锁管理器临时配置、简单的资源管理我的实践总结选择决策树 需要维护多个实例属性 → YES → 用类 需要精确控制异常抑制逻辑 → YES → 用类__exit__ 返回值更直观 逻辑简单就是获取资源 → 使用 → 释放 → YES → 用 contextmanager 不确定 → 默认用 contextmanager更简洁七、进阶技巧与生产实践7.1 可重入上下文管理器某些场景下同一个上下文管理器可能被嵌套使用。以线程锁为例importthreadingfromcontextlibimportcontextmanagerclassReentrantLock:支持嵌套的线程锁管理器def__init__(self):self._lockthreading.RLock()# 可重入锁self._depth0def__enter__(self):self._lock.acquire()self._depth1returnselfdef__exit__(self,exc_type,exc_val,exc_tb):self._depth-1self._lock.release()returnFalselockReentrantLock()# 嵌套使用——普通 Lock 会死锁RLock 不会withlock:print(f外层深度:{lock._depth})withlock:print(f内层深度:{lock._depth})7.2 多资源同时管理Python 允许在一个with语句中管理多个上下文# 方式一逗号分隔withopen(input.txt)asfin,open(output.txt,w)asfout:fout.write(fin.read().upper())# 方式二嵌套当资源之间有依赖时contextmanagerdeftransactional_db(db_url):connget_connection(db_url)try:yieldconn conn.commit()except:conn.rollback()raisefinally:conn.close()contextmanagerdefcache_layer(redis_url):clientredis.from_url(redis_url)try:yieldclientfinally:client.close()# 两个资源独立管理withtransactional_db(postgres://localhost/app)asdb,\ cache_layer(redis://localhost:6379)ascache:# 先查缓存缓存没有再查数据库cachedcache.get(user:1)ifcached:userjson.loads(cached)else:userdb.execute(SELECT * FROM users WHERE id 1).fetchone()cache.set(user:1,json.dumps(user),ex300)7.3 性能计时器——实战工具fromcontextlibimportcontextmanagerimporttimeimportlogging loggerlogging.getLogger(__name__)contextmanagerdeftimed(label:str,threshold_ms:floatNone): 性能计时上下文管理器 参数: label: 计时标签 threshold_ms: 超过此阈值毫秒时打印警告 starttime.perf_counter()yieldelapsed_ms(time.perf_counter()-start)*1000ifthreshold_msandelapsed_msthreshold_ms:logger.warning(f⚠️ [{label}] 耗时{elapsed_ms:.1f}ms超过阈值{threshold_ms}ms)else:logger.info(f⏱️ [{label}] 耗时{elapsed_ms:.1f}ms)# 使用withtimed(查询用户列表,threshold_ms200):usersdb.execute(SELECT * FROM users).fetchall()withtimed(批量写入,threshold_ms500):foruserinusers:db.execute(INSERT INTO archive VALUES (%s),(user.id,))八、总结上下文管理器是 Python 中被低估的强大工具。它用一种极其优雅的方式解决了资源管理中最棘手的问题——确保清理代码一定会执行。回顾核心要点协议本质__enter__初始化__exit__清理with语句保证配对执行返回值陷阱__exit__返回True会抑制异常除非你明确需要否则返回False两种实现类适合复杂场景contextmanager适合简单场景核心价值不是语法糖而是确定性资源管理的保障回到开头那个数据库连接泄漏的问题——如果团队里的每个人都能理解并使用上下文管理器这类 bug 根本不会出现。好的编程习惯不是天赋是训练出来的。你在项目中用过哪些自定义的上下文管理器有没有遇到过__exit__返回值导致的异常传播问题欢迎在评论区分享你的实战经验。附录与推荐资源Python 官方文档 - contextlibPEP 343 - The “with” Statement ——with语句的原始提案《流畅的Python》第2版—— 第 15 章上下文管理器与 else 块《Effective Python》第2版—— Item 66: 使用with语式管理资源

相关文章:

Python 上下文管理器深度指南:从协议原理到生产级实战

Python 上下文管理器深度指南:从协议原理到生产级实战 管理文件句柄、数据库事务、临时环境变量——为什么你的代码需要 with? 一、开篇:一个差点造成线上事故的故事 去年我们团队的一个服务出现了一个诡异的数据库连接泄漏问题。症状很隐蔽…...

终极跨平台游戏串流方案:Sunshine自托管服务器完全指南

终极跨平台游戏串流方案:Sunshine自托管服务器完全指南 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 你是否曾梦想过在任何设备上畅玩PC游戏?Sunshine作为…...

3分钟掌握ncmdump:网易云音乐NCM格式解密终极指南

3分钟掌握ncmdump:网易云音乐NCM格式解密终极指南 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM加密文件无法在其他设备播放而烦恼吗?ncmdump是一款专门解决网易云音乐NCM格式兼容…...

NVIDIA Profile Inspector实战指南:三步解锁驱动隐藏参数与游戏性能优化

NVIDIA Profile Inspector实战指南:三步解锁驱动隐藏参数与游戏性能优化 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector NVIDIA Profile Inspector是一款专为深度优化NVIDIA显卡性能而设计的…...

如何快速配置个性化游戏世界:ReTerraForged地形引擎终极指南

如何快速配置个性化游戏世界:ReTerraForged地形引擎终极指南 【免费下载链接】ReTerraForged TerraForged for modern MC versions 项目地址: https://gitcode.com/gh_mirrors/re/ReTerraForged 想要在Minecraft中打造独一无二的游戏世界吗?厌倦了…...

终极生产力革命:macOS自动点击器深度解析与实战指南

终极生产力革命:macOS自动点击器深度解析与实战指南 【免费下载链接】macos-auto-clicker A simple auto clicker for macOS Big Sur, Monterey, Ventura, Sonoma and Sequoia. 项目地址: https://gitcode.com/gh_mirrors/ma/macos-auto-clicker 你是否厌倦了…...

3步搞定!TranslucentTB中文界面终极设置指南:让你的Windows任务栏完美透明化

3步搞定!TranslucentTB中文界面终极设置指南:让你的Windows任务栏完美透明化 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/Transluc…...

避坑指南:DSP28335中断系统配置详解(从PIE到GPIO外部中断)

DSP28335中断系统深度避坑指南:从PIE配置到GPIO外部中断实战 在嵌入式控制系统开发中,DSP28335因其强大的实时处理能力而广受欢迎,但其中断系统的复杂性也让不少开发者踩坑。本文将基于实际项目经验,系统梳理从PIE模块配置到GPIO外…...

别再只会用histogram画图了!MATLAB直方图进阶玩法:从数据清洗到可视化调优

MATLAB直方图进阶实战:从数据洞察到学术级可视化 在数据分析的日常工作中,直方图往往被当作简单的数据分布查看工具,但真正掌握其精髓的数据科学家知道,一个精心调校的直方图可以成为发现数据异常、验证统计假设和讲述数据故事的多…...

2026从0到1!C#工控机开发实战指南:新手一周就能跑通的完整项目

做工业开发快十年了,见过太多新手卡在工控机开发的门槛上。很多人觉得工控开发很难,需要懂硬件、懂协议、懂现场,其实只要找对方法,零基础也能快速上手。我带过好几个刚毕业的大学生,都是从C#基础开始,一周…...

树莓派4B实时内核编译踩坑实录:从Ubuntu 20.04到RT-PREEMPT补丁的完整流程

树莓派4B实时内核编译实战:RT-PREEMPT补丁全流程与深度调优指南 第一次尝试给树莓派4B编译实时内核时,我盯着屏幕上那一串串报错信息足足发呆了半小时。作为一款广泛应用于工业控制、机器人开发等实时性要求较高场景的单板计算机,树莓派默认内…...

从表情包水印到安全通信:深入理解Python LSB算法的实战应用与局限

从表情包水印到安全通信:Python LSB算法的实战应用与局限剖析 当你在社交媒体上分享一张搞笑表情包时,是否想过这张图片可能隐藏着版权信息?这种看似魔术般的技术,背后是LSB(最低有效位)算法在发挥作用。作…...

Android手机变身专业USB键盘鼠标:无需目标端软件的终极解决方案

Android手机变身专业USB键盘鼠标:无需目标端软件的终极解决方案 【免费下载链接】android-hid-client Android app that allows you to use your phone as a keyboard and mouse WITHOUT any software on the other end (Requires root) 项目地址: https://gitcod…...

Wand-Enhancer:终极WeMod专业版免费解锁方案完整指南

Wand-Enhancer:终极WeMod专业版免费解锁方案完整指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 还在为WeMod专业版的高昂订阅费用而烦恼…...

Windows Cleaner:3分钟解决C盘爆红,让你的Windows电脑重获新生!

Windows Cleaner:3分钟解决C盘爆红,让你的Windows电脑重获新生! 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 你是否经常遇到…...

zteOnu完全指南:3分钟获取中兴光猫Telnet权限的秘诀

zteOnu完全指南:3分钟获取中兴光猫Telnet权限的秘诀 【免费下载链接】zteOnu A tool that can open ZTE onu device factory mode 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu 如果你正在寻找一款能够轻松获取中兴光猫Telnet权限的工具,…...

还在为多平台直播手忙脚乱?obs-multi-rtmp让你一次搞定所有平台

还在为多平台直播手忙脚乱?obs-multi-rtmp让你一次搞定所有平台 【免费下载链接】obs-multi-rtmp OBS複数サイト同時配信プラグイン 项目地址: https://gitcode.com/gh_mirrors/ob/obs-multi-rtmp 你是否曾经历过这样的场景:晚上8点直播开始&…...

SMUDebugTool:AMD Ryzen处理器硬件调试与性能优化的专业指南

SMUDebugTool:AMD Ryzen处理器硬件调试与性能优化的专业指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: http…...

终极指南:如何在Blender中无缝导入Rhino 3D文件(3dm格式)

终极指南:如何在Blender中无缝导入Rhino 3D文件(3dm格式) 【免费下载链接】import_3dm Blender importer script for Rhinoceros 3D files 项目地址: https://gitcode.com/gh_mirrors/im/import_3dm 你是否曾经在Rhino中创建了精美的3…...

终极指南:在SketchUp中免费导入导出STL文件的完整解决方案

终极指南:在SketchUp中免费导入导出STL文件的完整解决方案 【免费下载链接】sketchup-stl A SketchUp Ruby Extension that adds STL (STereoLithography) file format import and export. 项目地址: https://gitcode.com/gh_mirrors/sk/sketchup-stl 你是否…...

魔兽争霸3终极优化指南:5分钟解锁高分辨率与高帧率体验

魔兽争霸3终极优化指南:5分钟解锁高分辨率与高帧率体验 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3在现代显示器上的糟…...

终极安卓位置伪装指南:10分钟学会FakeLocation应用级虚拟定位

终极安卓位置伪装指南:10分钟学会FakeLocation应用级虚拟定位 【免费下载链接】FakeLocation Xposed module to mock locations per app. 项目地址: https://gitcode.com/gh_mirrors/fak/FakeLocation 还在担心社交软件暴露你的真实位置吗?想为不…...

在Linux系统上轻松安装哔哩哔哩客户端:5分钟搞定完整B站体验

在Linux系统上轻松安装哔哩哔哩客户端:5分钟搞定完整B站体验 【免费下载链接】bilibili-linux 基于哔哩哔哩官方客户端移植的Linux版本 支持漫游 项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-linux 想在Linux桌面系统上享受与Windows和macOS完全一…...

20世纪60年代UNIVAC计算机运行Minecraft服务器等程序,如何突破性能极限?

1. 项目成果展示 2026年4月17日,有人在一台20世纪60年代的UNIVAC 1219B计算机上运行Minecraft服务器,还展示了NES模拟器渲染出的《弹珠台》游戏第一帧画面、用“叠印”技术打印的自拍。此外,还运行了OCaml程序、Web服务器、Curve25519 AES加…...

30 秒开启!Brex 开源 CrabTrap,以大语言模型保障 HTTP 代理安全

开源项目 Brex 开源安全部署代理 CrabTrap,30 秒即可开启大语言模型评判的 HTTP 代理安全保障。 安全部署代理 CrabTrap 是一款以大语言模型为评判标准的 HTTP 代理,用于保障生产环境中代理的安全。它会拦截 AI 代理发出的每一个请求,依据…...

如何高效配置OBS多平台直播:obs-multi-rtmp完全实战指南

如何高效配置OBS多平台直播:obs-multi-rtmp完全实战指南 【免费下载链接】obs-multi-rtmp OBS複数サイト同時配信プラグイン 项目地址: https://gitcode.com/gh_mirrors/ob/obs-multi-rtmp 你是否曾为同时向多个平台直播而手忙脚乱?每次开播都要在…...

3步掌握FakeLocation:为Android应用设置独立虚拟定位的完整指南

3步掌握FakeLocation:为Android应用设置独立虚拟定位的完整指南 【免费下载链接】FakeLocation Xposed module to mock locations per app. 项目地址: https://gitcode.com/gh_mirrors/fak/FakeLocation 您是否遇到过这样的情况:某些应用过度索取…...

3分钟上手TranslucentTB:让你的Windows任务栏变透明的完整指南

3分钟上手TranslucentTB:让你的Windows任务栏变透明的完整指南 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB TranslucentTB…...

ESXi内存使用率100%?别慌!这不是故障是正常现象

很多运维小伙伴在管理ESXi主机时,打开监控面板会瞬间慌神:ESXi内存使用率直接拉满100%,甚至持续居高不下,担心是不是主机出了故障、虚拟机要卡顿崩溃。其实大家完全不用紧张,ESXi的设计理念就是“充分利用每一份内存资…...

免费获取3000+材料折射率数据:光学设计者的终极资源库

免费获取3000材料折射率数据:光学设计者的终极资源库 【免费下载链接】refractiveindex.info-database Database of optical constants 项目地址: https://gitcode.com/gh_mirrors/re/refractiveindex.info-database 你是否在为寻找准确的光学材料数据而烦恼…...