The Wisdom of Quinn网络完整教程:同步网络为什么很糟糕?5个致命理由
【免费下载链接】The-Wisdom-of-QuinnShare and Enjoy®项目地址: https://gitcode.com/gh_mirrors/th/The-Wisdom-of-Quinn
The Wisdom of Quinn是 Apple DTS 传奇工程师 Quinn "The Eskimo" 在开发者论坛的技术回答归档,本网络教程带你读懂其中最经典的《Five Reasons Why Synchronous Networking Is Bad》:为什么同步网络(阻塞网络调用)很糟糕?读完这 5 个致命理由,你将明白异步网络编程为何是移动端与服务器开发的唯一正解。🎯
一、先认识 The Wisdom of Quinn:为什么值得读
Share and Enjoy®
这个项目把 Quinn(Apple 开发者技术支持团队的 DTS 成员)在论坛中撰写的高质量帖子整理成了 PDF 归档,覆盖网络、签名、安全、调试、文件系统等硬核主题。它是学习 Apple 平台网络编程的一手资料库,新手也能受益。📚
资料位置:
- 入口与更新状态:
README.md(🟢新帖 / 🟡更新 / 🔴已被官方文档取代) - 更新历史:
CHANGELOG.md - 本篇原文 PDF:
pdfs/Five-Reasons-Why-Synchronous-Networking-Is-Bad.pdf - 网络资料总入口:
pdfs/Networking-Resources.pdf
二、网络操作的三种模式:先做对选择题
Quinn 开篇就指出,写网络代码时你其实只有3 种模式可选:
| 模式 | 行为 | 典型 API | Quinn 的态度 |
|---|---|---|---|
| 异步 | 把 I/O 交给 run loop,数据到达时系统回调你 | NSStream 绑定 run loop | ✅ 推荐 |
| 同步·轮询 | 周期性调用hasBytesAvailable反复"问"有没有数据 | NSInputStream 轮询 | ❌ 不推荐 |
| 同步·阻塞 | 调用read:maxLength:,没数据就一直卡住 | NSInputStream 阻塞读 | ❌❌ 更不推荐 |
轮询模式的毛病很直白:它在"浪费 CPU"和"浪费网络性能"之间二选一——
- 轮询太频繁 → 慢网络上烧 CPU(进而烧电池,手机/笔记本要命,如今桌面与服务器也受累)⚡
- 轮询太稀疏 → 快网络上白白牺牲吞吐量
所以真正要避开的"大坑",是同步阻塞网络(synchronous blocking networking)。它的危害没那么直观,下面逐条拆解。⚠️
三、5 个致命理由:同步阻塞网络为什么是毒药
理由 1:资源消耗惊人
阻塞式网络绝不能在主线程执行(会卡死界面),于是你被迫为每个连接开一个辅助线程。每个线程都要吃掉:
- 虚拟地址空间(永久占用)
- wired 内核栈(线程阻塞期间持续占用,无法换出)
当你同时维护大量空闲连接时,等于用一堆内核栈换来"零工作",资源直接打水漂。💸
理由 2:线程是"邪恶"的
一旦需要辅助线程,进程里就存在多线程,随之而来的是数据共享、同步与一致性问题。Quinn 的建议简单粗暴:能避免就不要引入。🧵
理由 3:取消极其困难
想在阻塞中喊停?要么写一大坨"跳跃式"的取消逻辑(参考他提到的 SocketCancel 示例),要么……轮询取消标志位(对,又回到了那个被批评的轮询)。用户体验上,"点取消却半天没反应"多半就是这么来的。🛑
理由 4:超时需要自己"造轮子"
部分阻塞 API 自带超时,但并非全部,而且自带的超时往往不如你期望的健壮。要么自己绕一堆技巧,要么接受残缺支持——同步阻塞"写起来简单"的假象到此破灭。⏱️
理由 5:无法全双工通信
单条同步阻塞连接上,做不到完整的双向(全双工)通信。想边发边收?抱歉,这条路走不通,只能再拆线程或连接,问题层层叠加。🔁
四、新手实操指南:如何快速切换到异步思路
- 默认选异步:把网络 I/O 挂到 run loop / 事件回调上,让系统"有数据再叫我"。
- 绝不轮询:别用定时器反复查
hasBytesAvailable式的接口。 - 绝不在主线程阻塞:阻塞调用放在子线程里也治标不治本,5 大理由一个都没消失。
- 设计取消与超时:异步模式下取消与超时是"一等公民",从架构上就支持。
- 需要双向通信时:用支持全双工的异步 API,而不是单连接阻塞收发。
五、延伸阅读:The Wisdom of Quinn 里的网络进阶资料 📖
读完本篇,项目里这些 PDF 可以按顺序跟进(均为纯文本路径,直接打开阅读):
- 网络资源清单:
pdfs/Networking-Resources.pdf(新旧两版都有) - 调试网络问题:
pdfs/Debugging-Resources.pdf、pdfs/Investigating-Network-Latency-Problems.pdf - 传输优化:
pdfs/Moving-to-Fewer,-Larger-Transfers-v2.pdf - 底层 socket:
pdfs/Calling-BSD-Sockets-from-Swift.pdf及pdfs/QSocket-I-O.pdf等系列 - 后台保活:
pdfs/Maintaining-a-TCP-Connection-in-the-Background.pdf - 现场排障:
pdfs/Network-Debugging-in-the-Field.pdf
一句话总结:同步阻塞网络省下的那几行代码,会以资源、线程、取消、超时、全双工五个方向加倍偿还——记住 Quinn 的建议,几乎永远选择异步网络。✨
【免费下载链接】The-Wisdom-of-QuinnShare and Enjoy®项目地址: https://gitcode.com/gh_mirrors/th/The-Wisdom-of-Quinn
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考