【问题标题】:How to print numbers in order using goroutine after emit all the goroutine发射所有goroutine后如何使用goroutine按顺序打印数字
【发布时间】:2020-06-02 15:58:19
【问题描述】:

在所有 goroutines bing 发出后,如何使用 goroutine 按顺序打印数字?

这是随机打印数字的代码:

func main() {

    var wg sync.WaitGroup
    wg.Add(10)
    for i := 1; i <= 10; i++ {
        go func(i int) {
            defer wg.Done()
            fmt.Printf("i = %d\n", i)
        }(i)
    }
    wg.Wait()

发射 goroutine 以打印如下数字,这不是我想要的解决方案。

func main() {

    var wg sync.WaitGroup

    for i := 1; i <= 10; i++ {
        wg.Add(1)
        go func(i int) {
            defer wg.Done()
            fmt.Printf("i = %d\n", i)
        }(i)
        wg.Wait()
    }

我希望所有的 goroutine 都被发出,然后让它们按顺序打印数字。

【问题讨论】:

  • 你的问题没有多大意义。您要求并行执行某些操作(因此是 go 函数)但它们的行为是串行的?
  • 您可以使用 goroutines 以随机顺序填充切片,然后对其进行排序并在主线程中打印。您可以使用单独的等待组或阻塞通道使所有 goroutine 在创建后立即阻塞,然后在它们完成后解除阻塞,以便它们同时启动,但这并不能保证顺序。基本上:您希望它们并行运行,还是希望它们按顺序运行?

标签: go goroutine


【解决方案1】:

func main() {
    wg.Add(10)
    count := 10
    cBegins := make([]chan interface{}, count)
    for i := range cBegins {
        cBegins[i] = make(chan interface{})
    }
    go func() {
        cBegins[0] <- struct {}{}
    }()
    for i := 0; i < count; i++ {
        go func(i int) {
            defer wg.Done()
            <-cBegins[i]
            fmt.Printf("i = %d\n", i)
            if i < 9 {
                cBegins[i+1] <- struct {}{}
            }
        }(i)
    }

    wg.Wait()

}

【讨论】:

    猜你喜欢
    • 2022-01-16
    • 2018-08-12
    • 1970-01-01
    • 2018-12-07
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 2023-04-03
    相关资源
    最近更新 更多