A coroutine can be thought of as an instance of suspendable computation
-
launch(推荐):
- 启动一个新的协程而不将结果返回给调用方,任何被视为“一劳永逸”(one shot)的工作都可以使用 launch 来启动。即,无结果预期的启动协程.
- 不阻塞当前线程;
- 返回一个Job,可以级联取消;
-
async:
- 启动一个新的协程并返回Deferred对象(类似Java的Future),在需要获取结果的地方,调用await的挂起函数等待结果返回。即,有结果预期的启动协程.
- 不阻塞当前线程
- 返回Deferred,继承自Job,await方法用于获取结果。
-
用哪个?
- 无需性能最优化,无脑用选launch,可以覆盖90+%的场景;
- **需要性能优化,**考虑使用async 拆分可并行任务或者做预拉取请求,比如:“多个独立耗时操作获取数据,然后聚合”的场景;比如商详页的数据预拉取;
- 不使用runBlocking;
Links
- Structured Concurrency
- Kotlin Channel
- Kotlin Flow
- Reactive Programming
- CPS