登录
首页 >  Golang >  Go问答

main 函数是作为 goroutine 运行的吗?

来源:Golang技术栈

时间:2023-04-13 18:56:37 410浏览 收藏

从现在开始,努力学习吧!本文《main 函数是作为 goroutine 运行的吗?》主要讲解了golang等等相关知识点,我会在golang学习网中持续更新相关的系列文章,欢迎大家关注并积极留言建议。下面就先一起来看一下本篇正文内容吧,希望能帮到你!

问题内容

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

正确答案

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

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

goroutine 是由 Go 运行时管理的轻量级线程。 go f(x, y, z) 启动一个新的 goroutine 运行f(x, y, z)f、x、y 和 z 的评估发生在 当前的 goroutine 中,而 的执行f发生在新的 goroutine 中。
Goroutines 运行在相同的地址空间中,因此对共享内存的访问必须同步。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()
}

这里 当前的 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) 

输出:

1
2
3
4

这里我们有一个maingoroutine 加上 3 个称为maingoroutines 的用户,所以这里的 goroutines 总数是 4。


main()让我们使用( 一个 goroutine - 不需要同步)计算阶乘。在线尝试:

package main

import "fmt"

func main() {
    if f 

输出:

120

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

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>