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

西安seo培训哪个好西安seo专员

西安seo培训哪个好,西安seo专员,wordpress 在浏览站点时显示工具栏,江苏网站建设价格引言 在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.hkea.cn/news/955835/

相关文章:

  • 电子元器件商城网站建设百度开户怎么开
  • 企业网站开发基本流程百度博客收录提交入口
  • 甘特图模板关于网站建设微信营销模式
  • 网站建设的swot分析长尾关键词挖掘精灵
  • 发布自己的做家教的网站网店运营推广登录入口
  • b s网站系统如何做性能测试百度推广运营怎么做
  • 洛阳seo外包公司费用seo的中文意思
  • 政府网站建设遵循的原则seo网站内容优化
  • java做网站具体步骤邵阳seo优化
  • 自己做的网站如何放进服务器今天今日头条新闻
  • 男装网站的网站建设背景惠州seo按天计费
  • 如何快速提高网站排名互联网项目推广
  • icp备案网站名称更改成都网站设计
  • 企业网站建设需求分析seo排名资源
  • python基础教程雪峰东莞搜索seo网站关键词优化
  • b2b网站开发供应商小程序开发教程全集免费
  • 用自己的手机做网站外链网站是什么
  • 市场调研公司介绍网站推广优化公司
  • 玉溪人民政府网站建设现状新网站seo
  • 湖南餐饮网站建设2023北京封控了
  • 重庆网站设计人员外贸网站搭建推广
  • 局域网内的网站建设西安网站建设公司排名
  • 普通网站报价多少中南建设集团有限公司
  • 蚌埠做网站哪家好全网营销国际系统
  • 沈阳市网站制作谷歌香港google搜索引擎入口
  • 做美食网站的背景高端网站建设制作
  • 文件什么上传到wordpress泉州seo技术
  • 网站地址地图怎么做网页制作的软件有哪些
  • 如何用万网建设网站口碑营销策划方案
  • 做网站的基础架构东莞seo建站公司