Go'巡回赛中的并发性

时间:2017-09-11 00:26:46

标签: go

我正在经历一次“环游之旅”。并且一直在编辑大部分课程,以确保我完全理解它们。我有一个问题:https://tour.golang.org/concurrency/1

package main

import (
    "fmt"
    "time"
)

func say(s string) {
    for i := 0; i < 5; i++ {
        time.Sleep(100 * time.Millisecond)
        fmt.Println(s)
    }
}

func main() {
    go say("world")
    say("hello")
}

离开main它的方式会产生一个hellos和worlds的随机排序,因为每次程序运行时线程都以不同的顺序执行。我有两个问题:

  1. 如果我从带有世界的行中删除go并将其添加到hello行,则会打印5次世界,并且根本不打印hello。这是为什么?
  2. 如果我在两行前添加go,则根本不会打印任何内容。这是为什么?
  3. 我有一些使用C ++并发的经验(虽然它是前一段时间)和一些最近使用Python的经验,但会描述我在并发性方面相当新手级别的整体体验。

    谢谢!

1 个答案:

答案 0 :(得分:5)

在您有机会看到结果之前,程序会终止。

您可以通过添加一个语句来解决此问题,该语句可确保main在其他例程完成之前不会退出。

来自Golang - Concurrency

  

使用goroutine,我们立即返回到下一行,并且不要等待该功能完成

他们给出了一个代码示例:

package main

import "fmt"

func f(n int) {
  for i := 0; i < 10; i++ {
    fmt.Println(n, ":", i)
  }
}

func main() {
  go f(0)
  var input string
  fmt.Scanln(&input)
}

关于上面的代码:

  

这就是为什么包含对Scanln功能的调用; 如果没有它,程序将在有机会打印所有数字之前退出