同步异步与阻塞非阻塞,哪种方式更适合我的应用场景?

摘要:概述 看了几篇同步,异步,阻塞和非阻塞的文章,感觉还是云里雾里的。本文结合自己的理解写几个例子加深印象,可能理解有误。大佬们可以帮忙批评指正。 个人理解同步异步,阻塞非阻塞是站在不同角度看的概念。 同步异步:站在被调用方视角看,同步会
概述 看了几篇同步,异步,阻塞和非阻塞的文章,感觉还是云里雾里的。本文结合自己的理解写几个例子加深印象,可能理解有误。大佬们可以帮忙批评指正。 个人理解同步/异步,阻塞/非阻塞是站在不同角度看的概念。 同步/异步:站在被调用方视角看,同步会执行调用方的请求,请求结束后返回执行结果给调用方。异步会先响应调用方请求,在执行调用方请求,最后给结果。 阻塞/非阻塞:站在调用方视角看,阻塞会等待被调用方响应,在等待期间啥事也不干。非阻塞在等待被调用方响应期间可以干别的事。 示例 本文以买咖啡为例介绍同步,异步,阻塞和非阻塞的几种情况。 同步阻塞 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() } 同步阻塞,当用户买咖啡时,咖啡师开始做用户的这一杯咖啡,用户等咖啡做好。咖啡师做好后把咖啡给用户,用户拿到咖啡。这是同步逻辑,可以看到同步阻塞,当咖啡师做咖啡时,用户啥也不干,效率较低。
阅读全文