主要功能是goroutine吗?

Man*_*kur 1 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
Run Code Online (Sandbox Code Playgroud)

was*_*mup 7

是的,main 函数作为一个 goroutine(主要的)运行。

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

goroutine 是由 Go 运行时管理的轻量级线程。 go f(x, y, z) 启动一个新的 goroutine runningf(x, y, z)对 f、x、y 和 z 的评估发生在当前的 goroutine 中,而 的执行f发生在新的 goroutine 中。
Goroutine 运行在相同的地址空间中,因此对共享内存的访问必须同步。sync 包提供了有用的原语,尽管在 Go 中你不需要它们,因为还有其他原语。

所以根据这个官方文档main当前的 goroutine
准确地说(字面意思)我们可以将main称为当前的 goroutine,所以简单地说它是一个 goroutine。(注意:从字面上看,这main()是一个可以作为 goroutine 运行的函数。)


现在让我们使用以下方法计算goroutine 的数量runtime.NumGoroutine()

例如,让我们运行 3 个 goroutine。在线试用:

package main

import (
    "fmt"
    "runtime"
    "time"
)

func main() {
    fmt.Println(runtime.NumGoroutine()) // 3
    time.Sleep(100 * time.Millisecond)
}
func init() {
    go main()
    go main()
}

Run Code Online (Sandbox Code Playgroud)

这里当前的 goroutine运行新的 goroutine,所以这里我们有不止一个 goroutine,它会main()再次执行。在线试用:

package main

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

func main() {
    fmt.Println(runtime.NumGoroutine()) // 1 2 3 4
    if atomic.LoadInt32(&i) <= 0 {
        return
    }
    atomic.AddInt32(&i, -1)
    go main()
    time.Sleep(100 * time.Millisecond)
}

var i int32 = 3
Run Code Online (Sandbox Code Playgroud)

输出:

1
2
3
4
Run Code Online (Sandbox Code Playgroud)

这里我们有 1 个maingoroutine 和 3 个名为maingoroutines 的用户,所以这里总共有 4 个 goroutines。


让我们使用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

Run Code Online (Sandbox Code Playgroud)

输出:

120
Run Code Online (Sandbox Code Playgroud)

注意:上面的代码只是为了清楚地展示我的观点,不利于生产使用(使用全局变量不应该是第一选择)。


Fli*_*mzy 6

主要功能是goroutine吗?

没有.

主要功能是功能.

相反,

一个够程是执行的轻量级线程.(来源).

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

然而...

main()函数在第一个(仅在启动时)goroutine执行goroutine #1.

但是只要该函数调用另一个函数,那么主goroutine就不再执行main函数,而是执行其他函数.

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

不要将goroutines与功能混为一谈!!

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