加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

golang 并发顺序输出数字

发布时间:2020-12-16 09:30:48 所属栏目:大数据 来源:网络整理
导读:参考 package mainimport ( "fmt" "sync/atomic" "time")func main() { var count uint32 trigger := func(i uint32,fn func()) { for { if n := atomic.LoadUint32(count); n == i { fn() atomic.AddUint32(count,1) break } time.Sleep(time.Nanosecond) }

参考

package main

import (
    "fmt"
    "sync/atomic"
    "time"
)

func main() {
    var count uint32
    trigger := func(i uint32,fn func()) {
        for {
            if n := atomic.LoadUint32(&count); n == i {
                fn()
                atomic.AddUint32(&count,1)
                break
            }
            time.Sleep(time.Nanosecond)
        }
    }
    for i := uint32(0); i < 10; i++ {
        go func(i uint32) {
            fn := func() {
                fmt.Println(i)
            }
            trigger(i,fn)
        }(i)
    }
    trigger(10,func() {})
}

踩坑点

  1. golang并发时,go程序需要有启动延时,需要让main函数休眠,才能让goroutine程序在main函数退出前有机会运行完毕
  2. goroutinue程序的启动和for循环执行完毕是同时的,想上述代码,一般情况下gorountine开始执行时,for循环已经结束,因此i是10了。因此需要把i通过闭包封到goroutinue里去
  3. goroutine是随机的,需要控制。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读