7 months ago
- 异步代码的设计目的是处理延迟而不仅仅是吞吐量,通过确保任务不阻塞关键线程来保持应用程序的响应性。
- 性能分为不同类型:吞吐量(快速完成任务)和延迟(某事发生前需要等待的时间)。
- 事件循环在现代应用中很常见,它需要在严格的时间预算内(例如UI响应性的16毫秒)处理用户输入、界面重绘和网络请求。
- 非阻塞代码确保事件循环不被阻塞,从而在等待慢速操作时允许其他任务继续执行。
- Async/await是使异步代码更易读的语法糖,但本身并不会使代码变为非阻塞。
- 线程和进程可用于并发,但会带来上下文切换开销、资源限制和线程安全编程复杂性等问题。
- 绿色线程和M:N调度器(如Go语言中的)提供轻量级并发,但可能无法有效利用多核性能。
- 延续传递风格(CPS)和生成器是实现非阻塞行为的替代方法,但可能增加代码复杂度。
- Python、Rust和JavaScript等语言中的Async/await会编译为状态机或生成器,在可读性和性能之间取得平衡。
- 进程重量级但适合隔离场景,线程更轻量但需要谨慎管理以确保安全。
- OCaml的效果系统为并发提供了强大替代方案,无需显式async/await语法即可实现可恢复的计算。
- 选择正确的并发工具取决于使用场景:CPU密集型任务用线程,I/O密集型任务用async/await,M:N调度器适合追求简单性和可扩展性的场景。