这个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)
是的,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)
注意:上面的代码只是为了清楚地展示我的观点,不利于生产使用(使用全局变量不应该是第一选择)。
主要功能是goroutine吗?
没有.
主要功能是功能.
相反,
一个够程是执行的轻量级线程.(来源).
所以goroutines执行函数,但是goroutine不是函数,并且goroutines和函数之间没有一对一的关系.
然而...
该main()函数在第一个(仅在启动时)goroutine执行goroutine #1.
但是只要该函数调用另一个函数,那么主goroutine就不再执行main函数,而是执行其他函数.
因此很明显,goroutine和函数是完全不同的实体.
不要将goroutines与功能混为一谈!!
函数和goroutines是完全不同的概念.将它们视为同一件事会导致无数的混乱和问题.