这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
《Python编程入门》13.1 async/await 与事件循环
协程函数调用后只返回一个协程对象,不 await 就静默不执行。本节从 async def 与 await 的语义讲起,用真实计时证明单线程并发,再用 time.sleep 与 asyncio.sleep 的对比说明阻塞调用如何卡死事件循环,并厘清 get_running_loop 与 get_event_loop 的差异。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
协程函数调用后只返回一个协程对象,不 await 就静默不执行。本节从 async def 与 await 的语义讲起,用真实计时证明单线程并发,再用 time.sleep 与 asyncio.sleep 的对比说明阻塞调用如何卡死事件循环,并厘清 get_running_loop 与 get_event_loop 的差异。
为《孢子三部曲》第一轮重写建立每周复盘机制,控制范围、记录变更、防止任务膨胀和旧稿再次拖住正文。
用 mvn package 把 demo 打成可执行 jar,拆解 BOOT-INF/classes、BOOT-INF/lib 与 JarLauncher 的内部结构,讲清 4.0 移除可执行 jar 启动脚本、4.1 用 tools 取代 layertools 两条变更,并说明分层 jar 与 Docker 镜像的关系。
对比传统 war 部署与内嵌 Tomcat,拆解 SpringApplication.run() 的环境准备、容器创建、Bean 加载与服务器启动四步,逐行解读 4.1.1 真实启动日志,并给出端口占用、Bean 创建失败、依赖缺失三类常见启动问题的日志特征与排查方法。
本节讲 TypeScript 最易被误用的一项能力:不新建声明,而是往已有类型上「长」成员。先讲清声明合并的规则,再区分在脚本里 declare module 与在模块里 declare module 这两个语义相反的写法,演示给 Request 加 user、给 process.env 加字段等真实场景,并列出冲突报错与规避手法。读完你能安全地做全局增强。
本节讲的是 .d.ts 的实战编写:当一个库既没有自带类型、社区也没有 @types 包时,如何从 JavaScript 源码、README 与运行时行为反推出准确的签名。内容覆盖三种粒度的声明策略、函数重载与可选参数、类与命名空间的合并写法、CommonJS 的 export = 与 import =、资源文件的通配声明,以及用类型测试保证声明不撒谎。读完你能为任意内部老库补上可用的类型。
本节从类型擦除讲起,解释为什么编译产物 .js 里不剩任何类型信息、消费方却依然能获得完整补全,从而引出 .d.ts 声明文件。我们会拆开 declare 的每一种用法,讲清「脚本」与「模块」在声明文件里的分水岭,梳理 @types 的查找顺序、typeRoots 与 types 的差别以及三斜线指令,并亲手写一个最小可用的声明文件。读完你能独立排查「找不到模块的类型声明」这类报错。
在 demo 项目里写出第一个 REST 接口:用 @RestController 与 @GetMapping 暴露 /hello,对比返回字符串与返回对象自动 JSON 序列化的差别,掌握 @RequestParam 与 @PathVariable 两种取参方式,并用 curl 完成一次真实的请求与响应验证。
从 TCP/IP 分层讲起,用 socket 手写能跑通的 echo server/client,理解 bind/listen/accept/connect/send/recv、粘包与分帧、settimeout;再用原始 socket 看清 HTTP 请求行长什么样,对比 urllib、requests 会话复用与 httpx 同步/异步双接口。
线程池与进程池共享同一套 concurrent.futures 接口:submit 返回 Future、map 保序、as_completed 抢先返回,异常要调用 result() 才抛出。本节实测进程池的 __main__ 守卫报错、小任务反转、chunksize 与启动开销,并讲清进程间共享数据。
GIL 让同一时刻只有一个线程执行 Python 字节码。本节讲清它保护什么、为何存在,用真实计时证明 CPU 密集多线程不提速而 IO 密集近线性提速,再讲透 Thread/Lock/Event/Semaphore/Queue、竞态复现与线程进程选型。
说明如何在第一轮重写中同步校正孢子生态规则和自然线索,避免设定、天气、土地、菌丝和人物行动彼此脱节。
本节读懂 demo 项目:给出标准 Maven 目录树并解释各目录职责,逐行拆解启动类与 @SpringBootApplication、SpringApplication.run;重点讲包扫描规则,说明启动类为何必须放根包;再讲 application.properties 与 yml 的位置与优先级、.gitignore 建议,以及两种运行方式的差别。
本节讲清如何用 start.spring.io 生成项目骨架:逐字段说明表单怎么填,强调 4.x 中 Spring Web 对应 spring-boot-starter-webmvc;给出等价的 curl 命令行方式,逐段解读生成的 pom.xml,并用表格对比 3.x 与 4.x 生成物在 parent 版本与 starter 名上的差异。
本节从使用者视角切换到包作者视角,讲清一个 npm 包如何被 TypeScript 正确识别。先看 package.json 里 main、module、types 这些历史字段的来历与局限,再重点拆解 exports 条件导出与其中的 types 条件、顺序要求,最后给出类型声明的三种来源、发布自己包的完整配置,以及消费者最常撞上的几类报错。
现实项目里 ES 模块与 CommonJS 长期并存,本节讲清两者如何互相调用。先看 package.json 的 type 字段与 .mjs/.cjs 扩展名如何决定文件的模块类型,再拆解 esModuleInterop、verbatimModuleSyntax 等开关到底改变了什么,以及 import type、__dirname 缺失、双包危害等实战坑与对应报错。
本节从模块化的历史讲起,说明为什么全局脚本会互相污染、ES 模块如何用显式的 export 与 import 把依赖写进代码。随后逐一拆解命名导出、默认导出、重命名与副作用导入的取舍,讲清相对说明符与裸说明符的区别,并用表格对照五种 moduleResolution 的查找规则与适用场景,最后给出扩展名、目录索引、循环依赖三类高频坑与对应报错。
本节搭建 Spring Boot 开发环境:说明为何锁定 Java 21 LTS,给出 macOS、Linux、Windows 三种 shell 下安装 JDK 与配置 JAVA_HOME 的写法,附 java -version 与 mvn -v 实测输出;再配置 ~/.m2/settings.xml 国内镜像加速,并汇总版本不匹配、JAVA_HOME 未生效、拉包慢等常见故障的排查方法。
sys.argv 太原始,argparse 是标准库自带的命令行解析方案。本节覆盖位置与可选参数、type 与 choices、nargs、store_true/count/append、子命令、FileType、parse_known_args 与退出码,并给出 __main__ 守卫组织方式,每个示例都真实运行。
print 无法分级、无法定向、无法关闭。本节讲清 logging 的 Logger/Handler/Formatter/Filter 架构、层级传播与 basicConfig 的局限,用 dictConfig 写完整配置,示范 % 延迟格式化、exc_info 异常日志、自定义 JSON Formatter 与日志轮转。