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

个人博客网站山东济南网站建设公司排名

个人博客网站,山东济南网站建设公司排名,晋中网络推广,网站设计师和网页设计师的区别引言 在Golang中,因为协程执行的顺序是不固定的,如果不在代码里进行控制,可能就会导致预期外的输出。 本文通过分析一段代码的执行来介绍这种情况,以及可行的控制协程执行顺序的方法: sleep()waitGroup 实例分析 代…

引言

在Golang中,因为协程执行的顺序是不固定的,如果不在代码里进行控制,可能就会导致预期外的输出。
本文通过分析一段代码的执行来介绍这种情况,以及可行的控制协程执行顺序的方法:

  1. sleep()
  2. waitGroup

实例分析

代码

func NewRingBuffer(inCh, outCh chan int) *ringBuffer {return &ringBuffer{inCh:  inCh,outCh: outCh,}
}type ringBuffer struct {inCh  chan intoutCh chan int
}func (r *ringBuffer) Run() {for v := range r.inCh {select {case r.outCh <- v:default:<-r.outCh // pop one item from outchanr.outCh <- v}}close(r.outCh)
}func main() {inCh := make(chan int)outCh := make(chan int, 4)rb := pkg.NewRingBuffer(inCh, outCh)go rb.Run()for i := 0; i < 10; i++ {inCh <- i}close(inCh)//time.Sleep(time.Millisecond * 50)for res := range outCh {fmt.Println(res)}
}

上面代码的作用是,声明ringBuffer环状缓冲区;主协程往inCh写10个数的同时,有一个协程异步的读取数据,并写到outCh中;
outCh是一个4缓冲区大小的channel,如果outCh没满就直接写入,否则把outCh的首部元素移除再添加;
因此,预期输出应该是:6、7、8、9。
但实际的输出是:5、6、7、8、9。

分析

多出来的“5”,是因为协程的执行顺序不可控,当主协程执行到

for i := 0; i < 10; i++ {inCh <- i
}close(inCh)

时,此时outCh中是5、6、7、8;run协程还没有继续执行,就开始遍历outCh:

for res := range outCh {fmt.Println(res)
}

然后输出阻塞后,run协程才继续执行,把9写到outCh中,因此最后的输出结果是5、6、7、8、9.

解决办法

sleep()

使用sleep()函数,能让当前协程让出CPU,暂停执行一段时间。
对于这种方法,可以对上面函数进行如下改造:

close(inCh)
time.Sleep(time.Millisecond * 50)
// 新增
for res := range outCh {fmt.Println(res)
}

WaitGroup

使用waitGroup可以实现协程间通信,对于这段例子,通过wg保证run()函数执行完后,在对outCh进行输出。
改造方法如下:

func (r *ringBuffer) RunWithWg(wg *sync.WaitGroup) {defer wg.Done()for v := range r.inCh {select {case r.outCh <- v:default:<-r.outCh // pop one item from outchanr.outCh <- v}}close(r.outCh)
}func TestRaceWithWg(t *testing.T) {inCh := make(chan int)outCh := make(chan int, 4)rb := pkg.NewRingBuffer(inCh, outCh)var wg sync.WaitGroupwg.Add(1)go rb.RunWithWg(&wg)go func() {for i := 0; i < 10; i++ {inCh <- i}close(inCh)}()wg.Wait()for res := range outCh {fmt.Println(res)}
}
http://www.yayakq.cn/news/752096/

相关文章:

  • 免费开源企业网站程序如何免费制作一个公司网站
  • 公司想做一个网站莞城建设网站
  • 百度不抓取网站建筑行业
  • 简单网站建设设计网站一级栏目
  • 如何设计营销 网站建设网站编程设计如何写备注
  • 广告位网站模板建设网站运营收入
  • 优化一个网站多少钱怎么做网站登陆战
  • 滨海县建设局网站浙江省建设局房管科网站
  • index.html网站怎么做怎么做才能发布网站
  • 视频门户网站建设项目标书建设网站 可以用3层架构吗
  • 山东网站建设公司哪家权威在线观看的seo综合查询
  • 科威网络做网站怎么样山东济南市网站建设
  • 什么做的网站推广东莞建设局网站
  • 网络服务合同wordpress 主机优化
  • 宁波方正建设监理网站服装产品开发流程
  • 网站建设怎么把代码放入网站上搭建一个网站多少钱
  • 一级a做爰片免费网站在线台州企业网站模板建站
  • 厦门北京网站建设wordpress flv
  • 免费网站app代码河北手机网站制作多少钱
  • 自己做网站的流程ts-428 WordPress
  • 韩国购物网站有哪些天河建网站公司
  • 营销网站建设的目的凡客官方网店
  • 自己可以建立网站吗网络营销与网络推广的异同
  • 柳州建站公司wordpress mu 中文
  • 东莞整合网站建设著名网页设计师及作品
  • 网站做整站做优化怎样自己建设网站
  • 网站导航设计欣赏宁夏建设工程造价网站
  • 遵义网上办事大厅广州网站优化效果
  • 家庭农场网站建设qq炫舞做浴缸的网站
  • 炫彩发光字制作网站wordpress 无插件主题