当前位置:首页 > 科技  > 软件

Go并发可视化解释 – select语句

来源: 责编: 时间:2023-09-18 21:41:14 483观看
导读上周,我发布了一篇关于如何直观解释Golang中通道(Channel)的文章。如果你对通道仍然感到困惑,请先查看那篇文章:《Go并发可视化解释 — Channel》。作为一个快速复习:Partier、Candier和Stringer经营着一家咖啡店。Partier

上周,我发布了一篇关于如何直观解释Golang中通道(Channel)的文章。如果你对通道仍然感到困惑,请先查看那篇文章:《Go并发可视化解释 — Channel》。ILt28资讯网——每日最新资讯28at.com

ILt28资讯网——每日最新资讯28at.com

Gophers' Cafe(Gopher咖啡馆)ILt28资讯网——每日最新资讯28at.com

在本文中,我将直观解释select语句,这是在Go应用程序中处理并发的另一个强大工具。Gophers和他们的虚构咖啡馆仍然是我的伙伴,但这次,让我们聚焦在Partier和点单部分。ILt28资讯网——每日最新资讯28at.com

情景

Gopher的Cafe意识到越来越多的顾客希望通过外卖应用程序在线订购咖啡。因此,除了店内点餐外,他们还选择了一个外卖应用程序。Partier会监视来自两个通道的订单,并通过另一个名为queue的通道将这些订单转发给Candier和Stringer。ILt28资讯网——每日最新资讯28at.com

select {case order := <-appOrders:    queue <- ordercase order := <-inShopOrders:    queue <- order}

当这两个通道中的任何一个有订单时,Partier会获取订单并将其转发到queue通道。ILt28资讯网——每日最新资讯28at.com

ILt28资讯网——每日最新资讯28at.com

ILt28资讯网——每日最新资讯28at.com

如果这两个通道都有订单,将会选择其中一个。在实际的咖啡店中,来自inShopOrders的订单可能会被优先处理。但是,在Go应用程序中,我们无法保证哪个订单会被选择。还要注意,select语句的执行只会选择一个订单,Partier不会一次选择两个订单。但是,在许多应用程序中,select语句通常嵌套在for循环中,以便在前一个迭代中剩下的订单有机会在下一个迭代中被选择。ILt28资讯网——每日最新资讯28at.com

select {case order := <-appOrders:    queue <- ordercase order := <-inShopOrders:    queue <- order}

但是,如果这两个通道都有订单,它们将再次进行公平竞争。ILt28资讯网——每日最新资讯28at.com

ILt28资讯网——每日最新资讯28at.com

默认情况(Default)

在非高峰时段,订单不多,Partier花费大量时间在等待上。他认为,他可以通过做其他事情来更有效地利用时间,例如清理桌子。这可以通过default来实现:ILt28资讯网——每日最新资讯28at.com

for {    select {    case order := <-appOrders:        log.Println("There is an order coming from appOrders channel")        queue <- order    case order := <-inShopOrders:        log.Println("There is an order coming from inShopOrders channel")        queue <- order    default:        log.Println("There is no order on both channels, I will do cleaning instead")        doCleaning()    }}

time.After()

time.After(duration)通常与select一起使用,以防止永久等待。与default不同,time.After(duration)会创建一个普通的<-chan Time,等待duration时间的流逝,然后将当前时间发送到返回的通道上。这个通道在select语句中与其他通道平等对待。正如你所看到的,select语句中的通道可以是不同类型的。ILt28资讯网——每日最新资讯28at.com

shouldClose := falsecloseHourCh := time.After(8 * time.Hour)for !shouldClose {    select {    case order := <-appOrders:        log.Println("There is an order coming from appOrders channel")        queue <- order    case order := <-inShopOrders:        log.Println("There is an order coming from inShopOrders channel")        queue <- order    case now := <-closeHourCh:        log.Printf("It is %v now, the shop is closing/n", now)        shouldClose = true    default:        log.Println("There is no order on both channels, I will go cleaning instead")        doCleaning()    }}log.Println("Shop is closed, I'm going home now. Bye!")

当处理远程API调用时,这种技术非常常见,因为我们无法保证远程服务器何时返回或是否返回。借助于context,通常不需要这样做。ILt28资讯网——每日最新资讯28at.com

responseChannel := make(chan interface{})timer := time.NewTimer(timeout)select {case resp := <-

本文链接:http://www.28at.com/showinfo-26-10449-0.htmlGo并发可视化解释 – select语句

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: SpringBoot拦截器和动态代理有什么区别?

下一篇: SpringBoot拦截器和动态代理有什么区别?

标签:
  • 热门焦点
  • 太卷!Redmi MAX 100英寸电视便宜了:12999元买Redmi史上最大屏

    8月5日消息,从小米商城了解到,Redmi MAX 100英寸巨屏电视日前迎来官方优惠,到手价12999元,比发布价便宜了7000元,在大屏电视市场开卷。据了解,Redmi MAX 100
  • 28个SpringBoot项目中常用注解,日常开发、求职面试不再懵圈

    前言在使用SpringBoot开发中或者在求职面试中都会使用到很多注解或者问到注解相关的知识。本文主要对一些常用的注解进行了总结,同时也会举出具体例子,供大家学习和参考。注解
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 讲故事上个月我写过一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,当时用的是 GDIView + WinDbg 把问题搞定,前者用来定位泄露资源,后者用来定位泄露代码,后面有朋友反
  • 2023年,我眼中的字节跳动

    此时此刻(2023年7月),字节跳动从未上市,也从未公布过任何官方的上市计划;但是这并不妨碍它成为中国最受关注的互联网公司之一。从2016-17年的抖音强势崛起,到2018年的&ldquo;头腾
  • 拼多多APP上线本地生活入口,群雄逐鹿万亿市场

    Tech星球(微信ID:tech618)文 | 陈桥辉 Tech星球独家获悉,拼多多在其APP内上线了&ldquo;本地生活&rdquo;入口,位置较深,位于首页的&ldquo;充值中心&rdquo;内,目前主要售卖美食相关的
  • 本地生活这块肥肉,拼多多也想吃一口

    出品/壹览商业 作者/李彦编辑/木鱼拼多多也看上本地生活这块蛋糕了。近期,拼多多在App首页&ldquo;充值中心&rdquo;入口上线了本机生活界面。壹览商业发现,该界面目前主要
  • 签约井川里予、何丹彤,单视频点赞近千万,MCN黑马永恒文希快速崛起!

    来源:视听观察永恒文希传媒作为一家MCN公司,说起它的名字来,可能大家会觉得有点儿陌生,但是说出来下面一串的名字之后,或许大家就会感到震惊,原来这么多网红,都签约这家公司了。根
  • 2纳米决战2025

    集微网报道 从三强争霸到四雄逐鹿,2nm的厮杀声已然隐约传来。无论是老牌劲旅台积电、三星,还是誓言重回先进制程领先地位的英特尔,甚至初成立不久的新
  • “买真退假” 这种“羊毛”不能薅

    □ 法治日报 记者 王春   □ 本报通讯员 胡佳丽  2020年初,还在上大学的小东加入了一个大学生兼职QQ群。群主&ldquo;七王&rdquo;在群里介绍一些刷单赚
Top