主要观点:异步编程可使应用更快,可在 Ruby on Rails 中使用异步来提速,原理适用于任何语言,示例分为两个基本原理。
关键信息:
- 第一个原理“别现在做可稍后做”:延迟做尽可能多的事,注意使用以“_now”结尾的方法,如
deliver_now
可改为deliver_later
发送邮件等,还可异步删除 Active Storage 文件和依赖关联等,并可配置dependent: :destroy_async
的最大删除记录数。 - 第二个原理“别原地不动”:避免等待,可使用
async
gem 并发发起请求,如用Net::HTTP
时,同步请求总时间约 10 秒,并发请求约 2 秒;Rails 7 起可使用ActiveRecord::Relation#load_async
并行运行数据库查询,可减少总时间,但要注意资源使用和潜在问题;可使用 Turbo Frames 并行加载页面部分,对于非关键或重量级部分有用;可设置脚本标签的async
属性并行加载脚本,拆分关键和非关键 CSS 及使用font-display: swap
懒加载字体,图片可使用loading="lazy"
属性懒加载,Rails 有默认懒加载图片配置;PostgreSQL 可使用concurrently
选项添加索引而不阻塞表,但总工作更多且耗时更长;Rails 6 引入并行测试,指定工人数量可加快测试,但 RSpec 需使用特定 gem 支持。 - 注意事项:异步编程会使代码更复杂,应先做好基础工作,如添加数据库索引、修复 N+1 查询等,遵循良好的 Ruby 和 Rails 实践,这些不是规则,有很多情况应更“主动”而非“懒惰”。
重要细节:文中提供了大量代码示例,如 Ruby on Rails 控制器代码、各种异步操作的代码等,详细说明了异步编程在不同方面的应用和实现方式。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。