主要功能是goroutine吗?

时间:2018-11-20 07:28:44

标签: go

main()函数是goroutine吗?例如,我看到了如下的崩溃堆栈跟踪,这让我发问:

goroutine 1 [running]: main.binarySearch(0x0, 0x61, 0x43,
0xc420043e70, 0x19, 0x19, 0x10)
     /home/---/go/src/github.com/----/sumnum.go:22 +0x80 main.main()
     /home/---/go/src/github.com/---/sumnum.go:13 +0xc1 exit status 2

3 个答案:

答案 0 :(得分:6)

  

主要功能是goroutine吗?

否。

主要功能是功能。

相反,

  

goroutine 是执行的轻量级线程。 (source)。

所以goroutines执行函数,但是goroutines不是函数,并且goroutines和函数之间没有一对一的关系。

但是...

main()函数在第一个(仅在启动时)例程goroutine #1中执行。

但是,一旦该函数调用了另一个函数,则主goroutine将不再执行主函数,而是执行其他函数。

因此,很显然,goroutine和函数是完全不同的实体。

请勿将goroutine与函数合并!

函数和goroutines是完全不同的概念。并且将它们视为同一件事将导致无数混乱和问题。

答案 1 :(得分:3)

是的,主要功能在goroutine(主要功能)中运行。

根据https://tour.golang.org/concurrency/1

  

goroutine是Go运行时管理的轻量级线程。   go f(x, y, z)   启动运行f(x, y, z)的新goroutine ,对f,x,y和z的求值发生在当前goroutine 中,并且执行f新goroutine 中。
  Goroutine在相同的地址空间中运行,因此必须同步访问共享内存。同步包提供了有用的原语,尽管您在Go中不需要太多,因为还有其他原语。

因此,根据此正式文档,main当前goroutine 中运行。


现在让我们来玩main并运行它(因此,当前goroutine 运行新goroutine ),所以在这里我们有更多而不是一个再次执行main()的goroutine ! (注意:对共享内存的访问必须同步):

package main

import (
    "fmt"
    "time"
)

var i = 3

func main() {
    if i <= 0 {
        return
    }
    i--
    fmt.Println("Hi")
    go main()
    time.Sleep(100 * time.Millisecond)
}

输出:

Hi
Hi
Hi

让我们使用main()计算阶乘(一个goroutine -无需同步):

package main

import "fmt"

func main() {
    if f <= 0 {
        fmt.Println(acc)
        return
    }
    acc *= f
    f--
    main()
}

var f = 5
var acc = 1

输出:

120

注意:上面的代码仅用于清楚地表达我的观点,并不适合生产使用(使用全局变量不应该是首选)。

答案 2 :(得分:0)

是的。 Main func可以生成其他goroutine,但是“ main”本身就是一个普通程序。

package main

import (
        "fmt"
        "runtime"
)

func main() {
        // Goroutine num includes main processing
        fmt.Println(runtime.NumGoroutine()) // 1

        // Spawn two goroutines
        go func() {}()
        go func() {}()

        // Total three goroutines run
        fmt.Println(runtime.NumGoroutine()) // 3
}