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

深圳网站制作公司排名南宁网络推广有几家

深圳网站制作公司排名,南宁网络推广有几家,淄博网站建设排行榜,手机网站建设 苏州使用 Select 如果此时我们有多个 channel,我们想从多个 channel 接收数据,谁来的快先输出谁,此时应该怎么做呢?答案是使用 select: package mainimport "fmt"func main() {var c1, c2 chan int // c1 and …

使用 Select

如果此时我们有多个 channel,我们想从多个 channel 接收数据,谁来的快先输出谁,此时应该怎么做呢?答案是使用 select:

package mainimport "fmt"func main() {var c1, c2 chan int // c1 and c2 == nil//n1 := <-c1//n2 := <-c2// 如果我们想同时从 c1 和 c2 接收数据, 谁来的快// 就先要谁, 此时就需要使用 select 来帮助我们完成上述任务select {case n := <-c1:fmt.Println("Received from c1:", n)case n := <-c2:fmt.Println("Received from c2:", n)default:fmt.Println("No value received")}
}

此时程序执行将会输出 default 的内容。为 select 加上一个无限循环,将会一直输出 default 的内容,但是如果去掉 default,将会报错:
在这里插入图片描述
这个错误在说的是,现在没有协程启动并向 channel 当中发送数据。

现在我们新建一个生产 channel 的工厂函数 generator,在 generator 当中,我们开启一个 goroutine,在 goroutine 当中我们开启一个无限循环,每一次迭代随机 sleep 一定时间,并将不断自增的 i i i输入到 channel 当中:

func generator() chan int {out := make(chan int)go func() {i := 0for {time.Sleep(time.Duration(rand.Intn(1500)) * time.Millisecond)out <- ii++}}()return out
}

此时修改 main 函数为:

func main() {c1, c2 := generator(), generator()//n1 := <-c1//n2 := <-c2// 如果我们想同时从 c1 和 c2 接收数据, 谁来的快// 就先要谁, 此时就需要使用 select 来帮助我们完成上述任务for {select {case n := <-c1:fmt.Println("Received from c1:", n)case n := <-c2:fmt.Println("Received from c2:", n)}}
}

得到的结果如下:

Received from c2: 0
Received from c2: 1
Received from c1: 0
Received from c1: 1
Received from c2: 2
Received from c1: 2
Received from c1: 3
Received from c2: 3
Received from c2: 4
... ...

一个更复杂的使用 select 的例子如下,下面的例子对上述代码进行了修改,加入了定时器,并使用 createWorker 和 worker 不断地开启 goroutine 并向 channel 发送数据:

package mainimport ("fmt""math/rand""time"
)func generator() chan int {out := make(chan int)go func() {i := 0for {time.Sleep(time.Duration(rand.Intn(1500)) * time.Millisecond)out <- ii++}}()return out
}func worker(id int, c chan int) {for n := range c {time.Sleep(time.Second)fmt.Printf("Worker %d received %d\n",id, n)}
}func createWorker(id int) chan<- int {c := make(chan int)go worker(id, c)return c
}func main() {var c1, c2 = generator(), generator()var worker = createWorker(0)var values []inttm := time.After(10 * time.Second)tick := time.Tick(time.Second)for {var activeWorker chan<- intvar activeValue intif len(values) > 0 {activeWorker = workeractiveValue = values[0]}select {case n := <-c1:values = append(values, n)case n := <-c2:values = append(values, n)case activeWorker <- activeValue:values = values[1:]case <-time.After(800 * time.Millisecond):// 如果每两次生成数据之间的时间超过了 800ms:fmt.Println("timeout")case <-tick:fmt.Println("queue len:", len(values))case <-tm:fmt.Println("bye")return}}
}
http://www.shuangfujiaoyu.com/news/1641.html

相关文章:

  • 建设一个网站 最好是官网那种搜索引擎优化的英文
  • 公司网站域名续费百度招聘
  • 网站建设合作2022当下社会热点话题
  • 抚顺建设网站百度网页版链接
  • 网站维护一般怎么做google建站推广
  • 网站开发需要的人员搜索引擎费用
  • 手机网站建设平台设计师经常用的网站
  • 找个建设网站的网管成都关键词自然排名
  • pos机做网站推广肇庆疫情最新消息
  • 如何查询网站是不是诈骗网站网页设计制作网站素材
  • 网站设计器上海网络推广服务公司
  • 传统网站怎么做前端模块seo裤子的关键词首页排名有哪些
  • 建设银行手机官方网站下载饥饿营销案例
  • 企业门户网站的意义短视频seo询盘获客系统
  • 建设银行企业银行官网微信小程序排名关键词优化
  • 做网站怎么返回首页朋友圈的广告推广怎么弄
  • 上海部道网站 建设百度搜索排名怎么靠前
  • 薛华成 旅游网站建设卖友情链接的哪来那么多网站
  • 网站建设公司哪家专业天津债务优化公司
  • 上海网站建设公司哪家好推广平台排行榜
  • 厦门做网站多网页模板建站系统
  • 怎么用文件传输协议登录网站百度推广后台登陆入口
  • dw做网站有哪些用处网络推广的主要工作内容
  • 网站建设企业的未来发展计划中山seo
  • 免费自助建站系统有哪些商城小程序开发哪家好
  • 网站seo优化要懂得做微调seo优化排名百度教程
  • 网站模板 英文如何用手机免费创建网站
  • 做catalog的免费网站流量神器
  • 别人做的网站不能用app推广30元一单
  • 网站建设成本预算网站建设优化公司