async/await 使用场景简析

简单说, async 用于申明一个 function 是异步的;而 await 则可以认为是 async await 的简写形式,是等待一个异步方法执行完成的。他们的应用场合是什么?

快速理解:同步、异步、多线程

async/await

  • 同步方法:调用时需要等待返回结果,才可以继续往下执行业务
  • 异步方法:调用时无须等待返回结果,可以继续往下执行业务
  • 开启新线程:在主线程之外开启一个新的线程去执行业务
  • 同步方法和异步方法的本质区别: 调用时是否需要等待返回结果才能继续执行业务

使用场合

理解后可以对号入座, async 是异步, await 是同步。考虑到程序的性能,一般多文件操作或者多任务操作会使用异步,但对本地文件操作其实很难会出现 IO 的瓶颈,所以一般 async 都是用于网络请求。

还有一点需要注意,async/await 并不是开启新的线程,它只是一种状态机,暂时退出当前场景,当监听到有新状态时就恢复上下文。如果是 CPU 消耗型的功能,比如大的图像处理,就不要使用异步,而是考虑多线程或多进程。golang 的 goroutine 在启动新线程方面做得很简洁。

权衡利弊

代码可读性、代码性能往往不能同时拥有,使用 async/await 也存在可读性与性能的问题,在实际使用中应该折中考虑,找到较好结合点。

本文网址: https://pylist.com/topic/189.html 转摘请注明来源

Suggested Topics

go get 使用socks5 代理安装依赖库

go 生态库还不够成熟,但会越来越完善,官方已经推出 `proxy.golang.org` ,国内的Gopher 们搭建了 `goproxy.cn`,尽管如此,我们在使用 `go get ...` 安装库时还是经常出现问题。...

使用国内pip 源

有些服务器对外网络很坑,幸好国内有好多优秀的源镜像...

SAE 上还是使用KVDB 方便

KVDB 是新浪云开发的分布式 key-value 数据存储服务,用来支持公有云计算平台上的海量key-value存储。...

Golang 版 supervisord 使用记录

python 版经常出现一些错误,比如 supervisor.sock 文件找不到的错误。懒得去整,试试二进制的 supervisord ,用 Go 语言编写。...

Leave a Comment