当前位置: 首页 > news >正文

购物网站商城策划沙坪坝区优化关键词软件

购物网站商城策划,沙坪坝区优化关键词软件,城市焦点商城网站建设案例,网站 栏目做下拉上周,我发布了一篇关于如何直观解释Golang中通道(Channel)的文章。如果你对通道仍然感到困惑,请先查看那篇文章。 Go并发可视化解释 — Channel 作为一个快速复习:Partier、Candier和Stringer经营着一家咖啡店。Partie…

上周,我发布了一篇关于如何直观解释Golang中通道(Channel)的文章。如果你对通道仍然感到困惑,请先查看那篇文章。

Go并发可视化解释 — Channel

作为一个快速复习:Partier、Candier和Stringer经营着一家咖啡店。Partier负责接受顾客的订单,然后将这些订单传递给厨房,Candier和Stringer制作咖啡。

4a8b8c43a8b79926b670c3d1e8796628.png

Gophers' Cafe(Gopher咖啡馆)

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

情景

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

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

当这两个通道中的任何一个有订单时,Partier会获取订单并将其转发到queue通道。

fe6d479e742783133996ee53b4a09910.png 69b1d1c2bc704632ec8aa92d99d6ab50.png

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

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

但是,如果这两个通道都有订单,它们将再次进行公平竞争。

5bcb1c847f1f6cec1d336f9b5758b175.png

默认情况(Default)

在非高峰时段,订单不多,Partier花费大量时间在等待上。他认为,他可以通过做其他事情来更有效地利用时间,例如清理桌子。这可以通过default来实现。

for {select {case order := <-appOrders:log.Println("There is an order coming from appOrders channel")queue <- ordercase order := <-inShopOrders:log.Println("There is an order coming from inShopOrders channel")queue <- orderdefault: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语句中的通道可以是不同类型的。

shouldClose := false
closeHourCh := time.After(8 * time.Hour)for !shouldClose {select {case order := <-appOrders:log.Println("There is an order coming from appOrders channel")queue <- ordercase order := <-inShopOrders:log.Println("There is an order coming from inShopOrders channel")queue <- ordercase now := <-closeHourCh:log.Printf("It is %v now, the shop is closing\n", now)shouldClose = truedefault: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,通常不需要这样做。

responseChannel := make(chan interface{})
timer := time.NewTimer(timeout)select {
case resp := <-
http://www.yayakq.cn/news/501084/

相关文章:

  • 旅游网站怎么自己做明星个人flash网站源码
  • 建设企业网站官网下载中心网站优化公司怎么选
  • 源码下载网站cms济南经三路专业做网站
  • 免费的企业网站建设网站如何做se
  • 洛谷网站中小玉文具怎么做什么网站做家具出口
  • 中国最大网站建设商推荐知乎wordpress如何修改页脚
  • 有哪些网站可以免费看电影集团门户网站建设策划
  • 亚马逊网站 如何做站内seo360易托管建站工具
  • 宁远县建设局网站深圳房地产网站设计
  • 饮食类网站wordpress如何加插件
  • python做网站的 框架做网站互联网公司
  • html5电影网站如何做泉州网站建设方案策划
  • 如何制作手机版网站wordpress宽屏插件
  • 网站 免备案手机网站建设一般要多少钱
  • 网站微信认证费用多少钱wordpress多域名移动主题
  • 有哪些优秀的个人网站高效网站推广设计
  • 描述一下网站建设的基本流程兰州网站维护公司
  • 移动端网站怎么做手机oa办公系统下载
  • 数据来源于网站怎么做参考文献建设征婚网站
  • 零陵网站建设广州网站建设案件
  • 网站一般字体网站如何做二维码
  • 网站搭建代码大全推广软文发稿
  • 福建省建设执业注册中心网站做网站需要注意的点
  • 河南省住建厅网站官网wordpress安装完不显示
  • 建网站要去备案做淘宝客网站需要多大带宽
  • 网站制作与网站建设实际报告广州网站建设q479185700棒
  • 网站建设服务公司案例智慧城市建设评价网站
  • 苏州网站建设一站通怎么制作手机软件app
  • 精湛的网站建设排行榜怎么学室内装修设计软件
  • 上海电子商务网站百度收录网站的图片