同步异步与阻塞非阻塞,哪种方式更适合我的应用场景?
摘要:概述 看了几篇同步,异步,阻塞和非阻塞的文章,感觉还是云里雾里的。本文结合自己的理解写几个例子加深印象,可能理解有误。大佬们可以帮忙批评指正。 个人理解同步异步,阻塞非阻塞是站在不同角度看的概念。 同步异步:站在被调用方视角看,同步会
概述
看了几篇同步,异步,阻塞和非阻塞的文章,感觉还是云里雾里的。本文结合自己的理解写几个例子加深印象,可能理解有误。大佬们可以帮忙批评指正。
个人理解同步/异步,阻塞/非阻塞是站在不同角度看的概念。
同步/异步:站在被调用方视角看,同步会执行调用方的请求,请求结束后返回执行结果给调用方。异步会先响应调用方请求,在执行调用方请求,最后给结果。
阻塞/非阻塞:站在调用方视角看,阻塞会等待被调用方响应,在等待期间啥事也不干。非阻塞在等待被调用方响应期间可以干别的事。
示例
本文以买咖啡为例介绍同步,异步,阻塞和非阻塞的几种情况。
同步阻塞
type Customer struct{}
func (c *Customer) BuyCoffee() {
coffee, ok := worker.MakeCoffee()
if !ok {
fmt.Println("make coffee failed")
}
fmt.Println("get my coffee", coffee.Name)
}
type Coffee struct {
Name string
}
type Worker struct{}
var worker Worker
func (w *Worker) MakeCoffee() (coffee *Coffee, ok bool) {
fmt.Println("start make coffee")
time.Sleep(1 * time.Second)
fmt.Println("make coffee finish")
return &Coffee{Name: "latte"}, true
}
func main() {
hxia := &Customer{}
hxia.BuyCoffee()
}
同步阻塞,当用户买咖啡时,咖啡师开始做用户的这一杯咖啡,用户等咖啡做好。咖啡师做好后把咖啡给用户,用户拿到咖啡。这是同步逻辑,可以看到同步阻塞,当咖啡师做咖啡时,用户啥也不干,效率较低。
