自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(2012)
  • 收藏
  • 关注

原创 为什么你的 DDR5-4800 性能反而倒退了?一文看懂内存的真实物理延迟

摘要:DDR5内存虽然拥有超高频率优势,但初代DDR5-4800因CL时序过高(CL40),实际物理延迟(16.67ns)反而比顶级DDR4-3200(CL16,10ns)慢67%,导致部分对延迟敏感的场景性能下降。真正的性能提升需兼顾频率与时序,如DDR5-6000 CL30可同时实现10ns低延迟和翻倍带宽。开发场景中,大模型训练等带宽密集型任务适合DDR5,而代码编译等延迟敏感场景仍需低延迟内存。建议选择DDR5-6000 CL30及以上规格以平衡性能。(149字)

2026-07-16 16:40:14 311

原创 让 Git 提交自动带「Verified」徽章:GitHub SSH 签名免 ssh-agent 实战

本文介绍了一种简化 Git SSH 签名流程的方法,无需使用 ssh-agent 或每次输入额外命令。关键步骤是将 user.signingkey 直接指向私钥文件路径(如 ~/.ssh/id_rsa),而非公钥内容。配置包括:设置 Git 使用 SSH 签名格式、创建 allowed_signers 文件映射邮箱与公钥、并将公钥添加到 GitHub 的 Signing Keys 区。该方法解决了常见的 Couldn't get agent socket? 报错问题,实现提交自动签名并显示 Verified

2026-07-07 21:57:15 349

原创 硬件调试避坑指南:为什么在 PCB 上直接测电容总是显示“无穷大”?

在嵌入式硬件开发中,PCB上测量电容时经常出现数值异常的现象。其根本原因是"并联漏流"效应——万用表的测量电流被并联的芯片和电阻分流,导致无法准确测量。尤其在高温状态下,半导体漏电流剧增会加剧这种测量失真。正确的排查方法包括:使用电阻档检查短路、必须断开电容一端进行离线测量、等待电路冷却后再测试。硬件调试需理解测量原理,避免无效操作,才能准确定位问题。

2026-07-06 23:47:57 332

原创 ESP-NOW 低功耗设备的可靠唤醒:一个被忽视的时序问题

摘要:ESP-NOW门锁唤醒失败问题的分析与解决 问题:ESP-NOW门锁系统在模式切换时存在60-70%的失败率,导致被控端无法按时切换模式。 错误假设:原以为延长发送窗口(66秒)远大于睡眠周期(20秒)就能保证唤醒,忽视了发送间隔(6秒)与唤醒窗口(30ms)的关系。 关键发现: 发送间隔必须小于唤醒窗口(25ms < 30ms) 覆盖时长必须大于睡眠周期(21s > 20s) 解决方案:采用25ms发送间隔,840次发送(覆盖21秒),确保每个唤醒窗口至少包含一次发送。最终形成通用公式:可靠唤醒=发

2026-07-05 22:10:22 295

原创 大模型时代的“古德哈特定律”:当 MMLU 达到 90%,我们该信什么?

AI模型的跑分指标(如MMLU)与其实际能力存在巨大落差,这源于经济学中的"古德哈特定律"——当指标成为目标,就会失去衡量价值。厂商为了宣传效果,通过数据污染和针对性训练"刷分",导致90%的高分只反映记忆能力而非真实智能。学界正通过升级测试标准(如MMLU-Pro、SWE-bench)、引入盲测机制(Chatbot Arena)来破解这一困局。文章提醒:评估AI应关注实际业务表现,而非发布会上的漂亮数据。真正的智能无法用单一指标衡量。

2026-06-26 14:24:03 345

原创 彻底搞懂字符编码:ASCII、Unicode、UTF-8、UTF-16

本文系统梳理了字符编码发展历程与技术原理。首先指出计算机仅处理二进制数字的本质,强调字符集(Unicode编号)与编码格式(UTF实现方案)的区别。重点分析了UTF-8的可变长存储优势(兼容ASCII、节省空间)和互联网统治地位,以及UTF-16因历史局限导致的缺陷。同时解释了JSON中\u转义的由来,并给出实际开发中的编码选择建议(优先UTF-8、数据库用utf8mb4)。全文最终归结乱码本质是编码与解码格式不匹配,帮助开发者从根本上理解并解决编码问题。

2026-06-24 11:11:08 404

原创 为什么中文会变成 \\u4f60\\u597d?一次性搞懂 Unicode、JSON 转义、乱码真相

摘要:文章解释了为什么中文在JSON、接口和日志中常显示为Unicode转义格式(如\u4f60),而英文保持不变。计算机只识别数字编号,Unicode转义是字符的标准数字表示形式,并非乱码或加密。ASCII字符(英文、数字等)直接显示,非ASCII字符(中文、表情符号等)默认转义以确保跨系统兼容性。开发者可通过设置(如ensure_ascii=False)关闭转义以提升可读性,但生产环境建议保持默认转义以确保稳定性。这种设计是JSON广泛兼容的核心机制。

2026-06-24 10:50:48 396

原创 pwsh(Windows Terminal)关闭多行粘贴弹窗提示完整方案

本文介绍了关闭Windows Terminal粘贴警告弹窗的两种方法:1)临时关闭(终端重启后失效),通过PowerShell命令直接修改当前设置;2)永久关闭(推荐),需在终端JSON配置文件中添加multiLinePasteWarning和largePasteWarning参数并设为false。文章同时指出原生PowerShell控制台无此弹窗,并提供了备用粘贴方式和防止粘贴后自动执行的PSReadLine优化命令。配置需重启终端生效,修改后多行粘贴不再弹出确认提示。

2026-06-24 10:00:38 231

原创 普通ADC引脚实现电容触摸:原理、电路、静电防护、休眠避坑全指南

摘要:本文详细解析了利用通用单片机的ADC引脚实现低成本电容触摸检测的方案。核心原理是通过1MΩ高阻电阻和陶瓷电容构建RC电路,利用固定充电时间后的电压差间接检测电容变化,无需专用触摸芯片。该方案适配金属门把手、钢丝等非标电极,但存在无法深度休眠唤醒的固有缺陷。文章从硬件设计(静电防护、参数选型)、软件滤波(动态校准、滑动均值)到场景适配全面拆解,并对比了与专用芯片方案的优劣,为不同需求提供优化方向(如低功耗场景推荐TTP223芯片,高稳定性推荐ESP32原生Touch)。关键点包括1MΩ电阻的必需性、AD

2026-06-22 14:53:39 372

原创 ESP-NOW + Deep Sleep 门锁方案实战:从 7 天续航到 1 个月+

本文介绍了如何通过ESP-NOW协议优化基于ESP32-C3的智能门锁续航方案。原WiFi常连方案仅7天续航,改用ESP-NOW后实现31天续航(10000mAh电池)。关键点包括:1)构建ESP-NOW网关架构;2)门锁周期性唤醒(200ms/1s);3)ESPHome实现细节与避坑指南(如ESP-IDF框架选择、GPIO配置等)。实测平均电流从95mA降至13mA,响应延迟控制在1秒内,并通过网关重发机制保证可靠性。虽然牺牲了即时性,但以15元网关成本换取了4.4倍续航提升,适用于低频控制场景。

2026-06-21 17:47:53 278

原创 当 asyncio.Lock 遇上多线程:一个看似简单却三次修错的并发 Bug

摘要:在开发MiQi Desktop时,遇到多线程并发场景下asyncio.Lock失效的问题。最初尝试延迟创建和动态重建锁都因跨线程竞争失败。最终解决方案是使用threading.Lock替代asyncio.Lock,通过严格控制临界区范围(仅保护字典操作)和隔离慢操作(异步启动子进程),实现了多event loop环境下的线程安全。关键发现:在"多线程+多event loop+共享对象"场景下,线程级同步原语比异步锁更可靠,但需确保临界区足够短且不含阻塞操作。该方案经并发测试验证有效。

2026-06-18 16:11:21 368

原创 彻底搞懂 Python threading\.Lock 与 asyncio\.Lock 核心区别(避坑\+实战)

本文深入解析Python并发开发中threading.Lock(线程锁)与asyncio.Lock(协程锁)的核心差异与使用场景。两类锁基于不同并发模型:线程锁通过操作系统内核实现真阻塞,用于多线程同步;协程锁依赖事件循环调度,仅挂起协程不阻塞线程。文章通过原理对比、性能分析、代码示例及混用陷阱说明,强调两者的绝对隔离性——线程环境必须用threading.Lock,异步协程必须用asyncio.Lock,交叉使用会导致程序死锁或崩溃。最后给出选型指南与混合并发场景的解决方案,帮助开发者规避常见错误,合理选

2026-06-18 15:51:45 185

原创 告别 PPO 的显存焦虑:三打白骨精式拆解 GRPO 的数学与防作弊艺术

本文介绍了DeepSeek提出的GRPO(组相对策略优化)方法,它通过"组内相对论"革新了传统的PPO算法。GRPO的核心思路是:对同一提示词生成多个回复,计算这些回复的奖励分数均值与标准差,以此定义相对优势值(Advantage),从而省去了PPO中Critic模型的计算开销,大幅降低显存占用。同时,GRPO通过组内归一化机制和KL散度惩罚,有效抑制了模型通过"奖励作弊"刷分的行为。在数学推理等任务中,结合确定性规则的硬核奖励机制进一步提升了训练效果。GRPO以简洁的数学设计实现了显存优化与训练稳定性提升

2026-06-17 13:26:03 382

原创 MiQi 的 Nanobot 架构:用完即弃的轻量 Agent

本文介绍了一种名为Nanobot的新型Agent架构设计,其核心特点是每次消息处理都创建全新的Agent实例,处理完成后立即销毁。文章详细分析了Nanobot的三层调用链结构(入口层、中间层和核心循环层),阐述了这种"用完即焚"设计相比传统常驻Agent的优势:避免内存泄漏、状态污染和并发冲突,同时支持配置热更新。文章还对比了Nanobot与主流框架的差异,并指出其局限性在于无法跨步骤共享计算状态和会话加载开销。这种轻量级、隔离性强的架构为Agent系统设计提供了新思路。

2026-06-16 10:25:12 225

原创 电脑打开手机DCIM/Camera文件夹卡顿?关掉预览视图,瞬间秒开

解决手机 DCIM\Camera 文件夹在电脑上打开卡顿、闪退的问题,核心原因是Windows系统默认生成缩略图预览,导致海量图片加载时CPU和内存负载过高。 最快解决方法: 打开文件夹后,切换视图为 “详细信息” 模式,避免加载缩略图。 永久关闭缩略图:在文件夹选项 → 查看 → 勾选 “始终显示图标,从不显示缩略图”。 优化建议: 关闭手机存储盘的索引功能 先复制文件到本地再查看 定期清理手机冗余文件 关键点:问题并非电脑配置低,而是系统预览机制导致,关闭缩略图即可秒加载。适用于所有Windows版本和

2026-06-15 21:42:16 462

原创 React 的 key 不只是列表用的——它是组件的“身份证“

React组件复用问题与key的正确使用 最近修复了一个聊天应用切换对话时消息发送被禁用的bug,原因是React默认复用组件实例导致状态残留。通过给组件添加key={sessionKey}解决,强制在切换对话时创建新实例。 key的作用是告诉React何时需要销毁旧组件并创建新实例。常见使用场景包括: 需要根据props完全重建组件时 需要强制重新触发useEffect时 表单切换需要清空输入时 但key不应被滥用,复杂状态管理应考虑提升状态、useEffect或useMemo等方案。正确使用key可以解

2026-06-15 17:39:54 242

原创 Kaggle双卡Tesla T4全框架踩坑实录:Transformers / vLLM / llama.cpp 兼容性、报错、选型全对比

Kaggle T4大模型推理框架对比与实测指南 本文针对Kaggle免费Tesla T4(sm7.5)环境,实测三大主流推理框架(HuggingFace Transformers、vLLM、llama-cpp-python)的兼容性、性能与适用场景。 核心结论: HuggingFace Transformers兼容性最佳,支持全格式模型,无编译依赖,适合调试与小众模型,但并发性能差。 vLLM在高端卡上性能领先,但T4环境因硬件限制(缺失FlashAttention2、NCCL通信问题)导致编译崩溃与多卡失

2026-06-14 18:24:18 424

原创 显式优于隐式:所有靠谱代码的底层设计哲学

《显式优于隐式:高质量代码的核心准则》摘要 本文深入探讨编程领域黄金法则"Explicit is better than implicit"的本质价值与实践方法。文章首先明确定义:显式代码要求逻辑透明无歧义,隐式代码则依赖默认规则和隐藏机制。通过变量推断、数据库设计、框架行为等典型场景,揭示隐式写法易导致数据异常、排查困难等长期隐患。核心价值体现为:降低沟通成本(显式代码可读性强)、增强可控性(避免黑箱风险)、提升调试效率(逻辑边界清晰)、适配大型项目(减少技术债务)。作者给出五类落地规范:变量类型声明、数

2026-06-03 11:43:13 215

原创 修复 Docker Desktop 启动报错:`C:\ProgramData\DockerDesktop` 所有权问题

摘要: Docker Desktop启动时报错C:\ProgramData\DockerDesktop必须由管理员账户拥有,原因是该目录所有权被误改为普通用户。提供三种解决方案: 命令行修复(推荐):以管理员身份运行takeown /F "C:\ProgramData\DockerDesktop" /A /R /D Y,递归重置目录所有权为管理员组。 图形界面修改:通过文件夹属性手动将所有者改为Administrators或SYSTEM,并替换子对象权限。 删除重建目录:彻底删除DockerDesktop文

2026-05-29 14:03:10 428

原创 GitHub Pages 主仓库绑定自定义域名,全局统一站点访问地址

GitHub Pages 站点可通过主仓库 用户名.github.io 实现全局域名绑定,简化多项目管理。只需在主仓库配置自定义域名并完成 DNS 解析(推荐 CNAME 记录),所有项目站点将自动继承该域名,格式为 自定义域名/仓库名。关键步骤包括域名验证、DNS 配置和主仓库绑定,无需逐个配置项目仓库。此方案统一访问入口,提升管理效率,适合个人博客、项目文档等场景。注意避免使用通配符 DNS 记录以确保安全。

2026-05-28 14:30:16 428

原创 DPO vs GRPO:大模型对齐的“两条路线”详解

DPO(Direct Preference Optimization,直接偏好优化),2023年由斯坦福大学提出,核心是绕过RM与RL,直接用成对偏好数据做对比学习。GRPO(Group Relative Policy Optimization,群组相对策略优化),2024年由DeepSeek团队提出,是PPO的无Critic变体,核心是多答案组内对比+相对优势归一化。DPO:用“离线、简单、稳定、低成本”重新定义大模型对齐,是工业界快速落地的首选方案,适合“稳”的场景;GRPO:用“

2026-05-28 10:02:47 434

原创 WSL 踩坑记录:为什么同一个命令,`bash -c` 找不到程序,`bash -lc` 却可以?

本文分析了Windows WSL开发中常见的Shell环境差异问题。当通过PowerShell调用WSL命令时,使用bash -c会提示命令不存在,而bash -lc却能正常执行。这是因为Linux Shell分为登录式和非登录式两种,加载的配置文件不同:登录Shell会加载.profile中的PATH设置,而非登录Shell仅加载.bashrc。许多工具(如uv、conda等)会将路径写入.profile,导致非登录Shell找不到命令。解决方案有两种:临时方案是统一使用bash -lc调用命令;永久方案

2026-05-26 11:15:55 452

原创 彻底解决 VS Code 诡异的文件图标丢失:从 README.md 变成“白板”说起

你是否遇到过这种情况:在 VS Code 中,明明安装了高颜值的图标主题(如 Material Icon Theme 或 vscode-icons),.py.vue甚至.gitignore都有漂亮的彩色图标,唯独项目的灵魂文件README.md变成了一个毫无生气的灰白色“普通文件”图标?本文将带你从现象深入本质,排查并彻底解决这个隐蔽的文件关联冲突坑。配置全局规则时慎用宽泛匹配:在设置文件关联(Glob Patterns)时,尽量精确到具体的后缀名(如*.md),避免使用可能引发歧义的通配符。

2026-05-20 14:23:57 405

原创 别再把 OIDC 和 OAuth 2.0 搞混了:写给开发者的通俗指南

👉 场景 A:机器与机器通信 (M2M) / 纯后端调用你的需求:你的后端服务需要定时去调用另一个微服务的接口。你的选择:纯 OAuth 2.0。这里根本没有“人类用户”,不需要验证身份,只要用客户端凭证换个 Access Token 即可。👉 场景 B:单纯的第三方登录 (SSO)你的需求:你开发了一个独立论坛,只想让用户“微信扫码一键登录”自动注册账号。你的选择:OIDC。你只需要拿到 ID Token 解析出用户的基本信息即可,拿完就走,不需要后续权限。

2026-05-19 10:47:16 342

原创 Git 踩坑日记:为什么本地有 Merge 提交时,千万别轻易执行 pull --rebase?

摘要: 使用 git pull --rebase 虽能保持提交历史线性整洁,但在处理本地合并提交(Merge Commit)时可能引发灾难性冲突。原因是 rebase 会拆解合并节点,导致已解决的冲突重复出现。解决方案包括: 关闭 rebase:用 git pull --no-rebase 保留合并历史; 高级 rebase:通过 --rebase=merges 保护合并节点; 撤销合并:重置后重新拉取,确保纯线性工作流。核心原则:合并后推送前,慎用默认 rebase,避免历史被破坏。

2026-05-19 09:28:02 492

原创 实验室里的“学霸”与街头上的“全才”:深度解析 PaLM 与 ChatGPT

2022年AI领域迎来重要转折点:Google发布5400亿参数的PaLM模型,展现强大推理能力;OpenAI推出ChatGPT,凭借RLHF技术和对话优化引爆市场。二者代表不同方向:PaLM专注通用AI极限,ChatGPT侧重交互体验。Google受限于搜索业务和成本考量,OpenAI则抓住产品化机遇。这场较量推动AI从规模竞赛转向能力融合,为后续Gemini等模型奠定基础,标志着AI进入多维度发展的新时代。(149字)

2026-05-15 11:30:31 244

原创 为什么一开麦,蓝牙耳机就变成了“座机音质”?——揭秘蓝牙底层协议与降噪机制

蓝牙耳机在通话时音质暴跌和降噪失效并非故障,而是蓝牙协议限制与硬件资源分配的结果。A2DP协议用于高质量音频播放,而开启麦克风后强制切换至HFP协议,导致音质骤降为单声道低码率。同时,麦克风被通话占用、DSP算力优先处理通话降噪,以及"侧音"设计都导致主动降噪功能暂时失效。目前最佳解决方案是将耳机仅作扬声器使用,外接独立麦克风;未来蓝牙5.2的LE Audio标准和LC3编码有望彻底解决这一问题。

2026-05-14 23:53:18 355

原创 从 Kaggle 到 Vercel Sandbox:为什么“云端沙盒”成了 AI 时代的乐高?

Vercel Sandbox通过MicroVM和快照持久化技术,实现了比传统Docker更安全、更快速的云端计算环境。与Kaggle不同,它专为API调用优化,支持秒级恢复和并行分叉,适用于AI代码解释器、安全沙箱等场景。这一技术将云端环境持久化能力解耦并API化,代表了云计算向更细颗粒度发展的趋势,为开发者提供了更高效的动态环境管理方案。

2026-05-13 10:18:31 302

原创 告别“蜘蛛网”提交记录:彻底搞透 git pull --rebase 与历史管理

摘要:本文探讨了Git协作中Merge与Rebase的区别,推荐通过git config --global pull.rebase true配置实现自动变基拉取,从而消除无意义的合并提交,保持提交历史的整洁线性。文章指出Rebase仅适用于本地未推送的私有提交,强调"不重写已推送历史"的原则,并提供了分叉场景的解决方案。最佳实践建议在本地开发时使用Rebase同步代码,合并到主干时采用Merge策略,既保证历史清晰又避免协作冲突。

2026-05-12 17:00:12 412

原创 告别 Python 路径地狱:从“商店版”陷阱到标准版 Poetry 的踩坑实录

本文记录了作者在Windows平台上使用Python时遇到的路径环境变量问题及解决方案。作者发现微软商店版的Python会将安装包放入沙盒缓存目录,导致路径未被正确添加到系统环境变量中。通过对比修补法和重建法,作者选择了彻底卸载商店版Python,改用winget安装官方标准版Python,并采用独立脚本安装Poetry的方法。文章详细介绍了三步走战略:卸载旧环境、安装官方Python、独立安装Poetry,并强调重启终端的重要性。最终解决了路径问题,为Python开发提供了干净规范的环境配置建议。

2026-04-28 13:30:41 445

原创 告别“高度塌陷”:前端新手必读的“清除浮动”生存指南

CSS浮动导致的高度塌陷问题及解决方案 摘要:CSS浮动元素会脱离文档流,导致父容器高度塌陷。文章分析了三种清除浮动的方法:1)物理隔断法(添加空标签+clear:both),但会污染HTML结构;2)BFC结界法(overflow:hidden),简单但有隐藏溢出的副作用;3)Clearfix伪元素法(::after+clear:both),通过CSS生成清除元素,是当前最推荐的解决方案。文章建议在正式项目中使用Clearfix方法,并指出现代布局应优先考虑Flexbox和Grid布局替代浮动。

2026-04-26 13:46:31 430

原创 为什么 Vue 开发环境看不到 Service Worker?(附 Workbox 哈希与缓存原理)

摘要:Vue CLI 的 PWA 插件在开发环境(npm run serve)下默认禁用 Service Worker 和文件哈希,这是官方设计而非配置问题。开发环境禁用 SW 是为了避免热更新冲突,提高调试效率;而生产环境自动启用 SW 和文件哈希,确保缓存更新机制生效。如需测试 SW,推荐使用打包后的预览环境(npm run build + serve dist),而非强制开启开发环境 SW。这一设计平衡了开发体验和生产需求,开发者无需为此困惑。

2026-04-25 10:21:41 441

原创 深入浅出数据库底层:WAL 与 MVCC 的“相爱相杀”

摘要: WAL(预写日志)和MVCC(多版本并发控制)是数据库实现ACID的核心机制。WAL通过顺序写入日志确保数据持久性,MVCC通过多版本数据实现读写并发。二者深度协作:WAL记录MVCC版本变更,保障崩溃恢复;事务提交依赖WAL落盘,MVCC据此控制版本可见性。MySQL通过WAL保护Undo Log支撑MVCC,PostgreSQL则直接将MVCC数据变更写入WAL。类比银行场景,MVCC提供数据快照,WAL记录操作日志,二者协同保障数据一致性与高并发。不同数据库实现差异体现了性能与可靠性的平衡设计

2026-04-18 10:09:39 456

原创 run_in_threadpool 与 BackgroundTasks 到底怎么选?

如果你在使用 FastAPI,那你一定体会过异步编程带来的极致快感。单核轻松扛住上万并发,仿佛拥有了魔法。但现实总是骨感的,在实际开发中,我们总会不可避免地遇到一些**“猪队友”**——老旧的同步数据库驱动、必须同步调用的第三方 SDK、或者缓慢的磁盘 I/O。如果你敢把这些同步阻塞代码直接塞进async def路由里,你的高并发神器瞬间就会变成“单线程排队机”。为了拯救阻塞,FastAPI 提供了两个神兵利器:run_in_threadpool和 BackgroundTasks。

2026-04-17 20:40:07 387

原创 别被 `run_in_threadpool` 骗了,它只是个“背锅侠”!

FastAPI中run_in_threadpool的本质是转移而非解决阻塞问题。它将同步阻塞代码(如requests.get)放到子线程执行,避免主事件循环卡死,但并未真正实现异步。线程池默认40个线程上限,高并发时仍会耗尽;CPU密集型任务更会因GIL争夺导致性能下降。正确做法是:优先使用原生异步库(如httpx),谨慎使用线程池处理少量同步I/O,CPU密集型任务应改用多进程或任务队列。run_in_threadpool只是权宜之计,而非并发银弹。

2026-04-17 19:45:38 411

原创 Python 既然有 GIL 锁,单线程下的“协程”到底有什么用?

Python的GIL(全局解释器锁)限制了多线程在CPU密集型任务中的性能,但对I/O密集型任务仍有效。协程(asyncio)通过单线程异步处理I/O任务,避免了线程切换开销,实现更高并发。总结:CPU密集型用多进程,低并发I/O用多线程,高并发I/O用协程。

2026-04-17 19:39:16 352

原创 uvicorn 多 Worker 并发任务队列迁移实录

摘要:本文分析了FastAPI多进程部署中内存字典存储任务状态的问题,提出了基于SQLite WAL模式的解决方案。原方案因进程隔离导致任务状态不一致,新架构采用SQLite存储元数据+磁盘存储大文件的策略,通过WAL模式实现多进程安全访问。文章详细介绍了SQLite配置、文件生命周期管理方案,并分析了数据流时序,最后指出了当前实现的竞争条件和优化方向。该方案为零依赖的单机部署提供了可靠的任务存储方案。

2026-04-16 21:59:51 407

原创 别被骗了:Flask 的默认 Session,其实是个“伪装”的 JWT

摘要: Flask默认Session采用无状态设计,类似JWT,数据存储在客户端Cookie中而非服务端,仅签名不加密,存在安全隐患。这种机制导致无法强制用户下线,一旦Cookie未过期,用户仍可访问。解决方案是使用Flask-Session扩展搭配Redis,将数据存储到服务端,通过Session ID控制会话,实现用户管理能力。

2026-04-15 21:59:19 362

原创 Web 开发避坑指南:Cookie 里到底该存些什么?

摘要:本文剖析了Web开发中Cookie的正确使用方式。Cookie应存储"钥匙"而非"数据",绝对避免存储敏感信息、权限标识和大容量数据。最佳实践包括:1)有状态架构仅存储Session ID;2)无状态架构精简JWT内容;3)可存储非敏感UI偏好数据。核心原则是将Cookie视为"房卡"——仅含必要鉴权标识,具体数据由后端查询。合理使用Cookie能提升系统安全性和性能。

2026-04-15 21:39:19 359

原创 别被“纯解释型语言”骗了:揭开 Python 运行机制的真实底牌

Python并非纯解释型语言,其执行过程暗藏多层优化机制。源码先被编译为字节码,再由Python虚拟机解释执行。现代Python通过调用C++/CUDA编译的底层库实现高性能计算,形成"胶水"架构。未来JIT技术将进一步加速纯Python代码。这种混合架构让Python既能保持开发效率,又能驾驭高性能计算场景,重新定义了编程语言的性能边界。

2026-04-12 13:28:43 347

gauss R-Group Fragment中所有基团的gjf数据

["00ethyl.gjf", "01n-propyl.gjf", "02iso-propyl.gjf", "03n-butyl.gjf", "04tert-butyl.gjf", "05vinyl.gjf", "06ethynyl.gjf", "07formyl.gjf", "08carboxyl.gjf", "09formamidyl.gjf", "10nitro.gjf", "11nitroso.gjf", "12cyano.gjf", "13sulfonyl.gjf", "14thionyl.gjf", "15phosphonyl.gjf", "16mesylate.gjf", "17tosylate.gjf"]

2023-02-26

一键停靠所有dockwidget窗口

先将属性浮动开启,然后直接平移

2023-02-26

使用opengl绘制框选动画,鼠标按下且拖动时生成一个矩形框,鼠标松开时,矩形框消失

class RectPainter: def __init__(self): # super().__init__() self.start_x = 0 self.start_y = 0 self.end_x = 0 self.end_y = 0 self.clear_flag = False def prepare(self): vshader_src = """ #version 330 core layout (location = 0) in vec3 aPos; void main() { gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0); // gl_Position是内置变量 }

2023-02-26

利用rdkit将smiles转化为原子坐标键数据,并用正则表达式将数据提取

from rdkit import Chem from rdkit.Chem import AllChem # from rdkit.Chem import Draw import re # 读取 SMILES 字符串 smiles = "CC(=O)OC1=CC=CC=C1C(=O)O" # smiles = "C1=CC=CC=C1" mol = Chem.MolFromSmiles(smiles) mol3d = Chem.AddHs(mol)#加氢2/3 statis = Chem.MolToMolBlock(mol3d) print(statis) print(type(statis)) a = re.findall(r'(-?\d.\d+)\s+(-?\d.\d+)\s+(-?\d.\d+)\s(\w)\s+', statis) # b = re.findall(r'([^0\n a-zA-Z]+)\s+([^\n a-zA-Z]+)\s+([^0\n a-zA-Z]+)\s+\d+\s+', statis) b = re.findall(r'([1-9][0-9^.

2023-02-26

读取gjf文件内容(使用python正则表达式读取高斯输出文件的内容)

使用python正则表达式读取高斯输出文件的内容,atom_info是所有原子名称存储文件,其余gjf文件是提供的例子,在py文件中可以修改文件名来读取不同gjf文件 读取后格式:([[-0.2131818033333333, -0.30164527666666663, 0.0], [0.7468181966666667, -0.30164527666666663, 0.0], [-0.5336363933333335, 0.6032905533333334, 0.0]], [[1, 2, 1.0], [1, 3, 1.0]], [15, 1, 1])这是一个氧两个氢也就是水分子的数据,第一个列表是坐标信息,第二个列表是键信息(前两个为原子下标,最后是键类型),第三个列表是对应原子下标的原子序数

2023-02-23

OpenGL框选动画

2023-01-22

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除