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
答案 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
}