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

建设网站那个好哪些网站做的比较好

建设网站那个好,哪些网站做的比较好,阿里云建站后台,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.yayakq.cn/news/653621/

相关文章:

  • 内江网站怎么做seo深圳电器公司官网
  • 常州网站建设乛薇广告设计公司朋友圈文案
  • google属于搜索引擎类网站.微信公众号的子菜单网页怎么制作
  • 如何建设一个收费的影视图文网站主题资源网站建设 反思
  • 网站开发需要用哪些东西营销型网站建设步骤
  • 新洲区城乡建设局网站怎么样引流顾客到店方法
  • 阜阳建设网站公司电话钓鱼网站怎么制作视频
  • 做58同城网站花了多少钱集团公司做网站
  • 光谷网站制作正规的报价单格式
  • 辽宁专业模板网站建设公司品牌网站设计制作哪家正规
  • 西安网站优化服务项目改造方案
  • 临沂专业网站建设公司电话网站开发常用图标 图像
  • 定制网站系统影视网站的设计与实现
  • 哪里有做网站的公司公司网站开发步骤
  • 网站友情链接模块expression wordpress主题
  • 外管局网站做延期收款报告网站建设-应酷
  • 网站建设简介电话做网站编程要学什么
  • 网站描述 修改泉州最专业微信网站建设公司
  • 大型淘宝客返利网站建设jquery 网站后台模板
  • 广州网站建设(信科分公司)什么是网站源码
  • 赣州网站开发太原网站建设公司5858
  • 高大上企业网站广州市研发网站建设平台
  • 做微商自己建网站合适吗编程网课哪家好
  • 电力建设期刊网站投稿建设网站简单教程
  • 020网站开发多少钱墨刀做网站上下滑动的交互
  • 铜川网站建设报价公路建设查询网站
  • 做阀门销售在哪个网站上做好有没有可以做游戏的网站吗
  • 如何用文档做网站计算机应用技术专业网站开发方向
  • 零食网站页面模板公司申请网站建设申请理由
  • 慕课网网站开发背景电子商务网页设计模板