亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

main 函數是否運行一個 goroutine?

main 函數是否運行一個 goroutine?

Go
慕的地8271018 2023-05-08 18:02:30
該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 回答

?
飲歌長嘯

TA貢獻1951條經驗 獲得超3個贊

main 函數是 goroutine 嗎?

不。

主要功能是一個功能。

相比之下,

goroutine是一個輕量級執行線程。

所以goroutines執行的是函數,但是goroutines不是函數,goroutines和函數之間不是一對一的關系。

然而...

main()函數在第一個(并且僅在啟動時)goroutine 中執行,goroutine #1.

但是一旦該函數調用另一個函數,main goroutine 就不再執行 main 函數,而是執行其他函數。

所以很明顯 goroutine 和函數是完全不同的實體。

不要將 goroutines 與函數混為一談!!

函數和協程是完全不同的概念。而將它們視為同一事物會導致無數的困惑和問題。


查看完整回答
反對 回復 2023-05-08
?
30秒到達戰場

TA貢獻1828條經驗 獲得超6個贊

是的,主要功能作為 goroutine(主要的)運行。

goroutine 是由 Go 運行時管理的輕量級線程。?go f(x, y, z)?啟動一個新的 goroutine 運行f(x, y, z)f、x、y 和 z 的評估發生在當前 goroutine中,而執行f發生在新的 goroutine 中。
Goroutines 運行在同一個地址空間,所以對共享內存的訪問必須是同步的。sync 包提供了有用的原語,盡管在 Go 中你不需要太多,因為還有其他原語。

所以根據這個官方文檔,這main當前的 goroutine。
準確地說(字面意思)我們可以將 themain稱為當前 goroutine,所以簡單地說它是一個 goroutine。(注意:從字面上看,這main()是一個可以作為 goroutine 運行的函數。)


現在讓我們計算使用的 goroutines 的數量runtime.NumGoroutine()

作為一個例子,讓我們運行 3 個 goroutines。在線試用:

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) <= 0 {

? ? ? ? return

? ? }

? ? atomic.AddInt32(&i, -1)

? ? go main()

? ? time.Sleep(100 * time.Millisecond)

}


var i int32 = 3

輸出:


1

2

3

4

這里我們有一個maingoroutine 加上 3 個名為 goroutines 的用戶main,所以這里的 goroutine 總數是 4。


讓我們使用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

注意:上面的代碼只是為了清楚地表達我的觀點,不利于生產使用(使用全局變量不應該是首選)。


查看完整回答
反對 回復 2023-05-08
?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

是的。Main func 可以生成其他 goroutine,但“main”本身就是一個 goroutine。


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

}


查看完整回答
反對 回復 2023-05-08
  • 3 回答
  • 0 關注
  • 156 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號