【问题标题】:unexpected output from goroutinesgoroutine 的意外输出
【发布时间】:2018-06-14 14:25:33
【问题描述】:

我正在使用 Go 并发并且有以下代码:

package main

import (
    "fmt"
    "runtime"
    "sync"
)

func main() {
    runtime.GOMAXPROCS(1)
    var wg sync.WaitGroup
    wg.Add(2)
    fmt.Println("Starting Goroutines")
    go func() {
        defer wg.Done()
        for count := 0; count < 3; count++ {
            for char := 'a'; char < 'a'+26; char++ {
                fmt.Printf("%c", char)
            }
        }
        fmt.Println()
    }()
    go func() {
        defer wg.Done()
        for count := 0; count < 3; count++ {
            for char := 'A'; char < 'A'+26; char++ {
                fmt.Printf("%c", char)
            }
        }
        fmt.Println()
    }()
    fmt.Println("Waiting to Finish")
    wg.Wait()
    fmt.Println("Terminating")
}

我的输出是:

Starting Goroutines
Waiting to Finish
ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
Terminating

我的问题是我声明第一个 goroutine 显示小写字母,第二个 goroutine 显示大写字母。输出不应该是先小写再大写吗?

任何解释都会有所帮助。

注意:此代码来自 Go In Action 电子书,我没有完全理解他们的解释。

【问题讨论】:

  • goroutines 的全部意义在于它们是并发的。您在代码中键入它们的顺序不会影响它们的执行顺序。
  • 这么多连续投反对票的人....记得SO要求请评论为什么你也投反对票....

标签: go concurrency


【解决方案1】:

每次执行程序时,您的输出都会有所不同。不保证 goroutine 的执行顺序。因此,您的输出不是确定性的。

【讨论】:

  • 所以在处理并发时我不应该依赖执行顺序吗?我想这很明显
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 2020-02-21
  • 2012-05-06
  • 2019-03-21
  • 2019-08-29
  • 2012-11-05
  • 2021-06-14
相关资源
最近更新 更多