不会阻塞线程
当执行 async/await 方法时,主线程遇到 await 关键字,主线程就返回执行,然后释放,而不是等待,再新开了一个子线程执行另外的业务,await 前面的方法还是主线程执行,await 后面的方法,等子线程执行完了再继续执行
同步的方式写异步
虽然是用了异步,但还是等待执行结果再往下执行,执行流程是同步的
不能提升单个请求
await 等待了结果再执行后面的逻辑,还是串行的,执行完该多少秒还是多少秒, 中间还切换线程去处理了,相比同步来说还多了切换线程的损耗。
提升并发请求处理 (I/O 密集型)
资源有限的时候,能增加吞吐量(单位时间处理的请求),增加 cpu 的利用率。
简单说就是有 10 个线程,每个线程的速度没有提升,然后 QPS 能提升?!
什么是 I/O 密集型
cpu 性能比硬盘内存好太多,大部分时间都是 cpu 在等 IO 的读写操作,例如读文件,读文件的时候是不需要 cpu 参与的,只需要发一个命令给硬盘,硬盘读完文件会再通知 cpu 继续处理,这种叫 DMA 技术。
如读文件需要 1s,如果是同步,那么就有一个线程在等 1s 再往下执行;如果是异步,读文件的时候,这个线程就释放了,等读完文件,硬盘通知 cpu 再派一个线程接着处理,那中间的 1 秒,原来的线程就可以去处理其他请求了
。
常见的操作有:文件读写、http 请求、数据库请求、redis 请求等。
不能提高 cpu 密集型 QPS
常见的操作有:计算密集型,硬盘、内存性能比 cpu 好很多,或不太需要访问 I/O 设备。
QPS
:每秒查询率(QPS,Queries-per-second)是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,性能经常用每秒查询率来衡量。