3 回答

TA貢獻(xiàn)1951條經(jīng)驗(yàn) 獲得超3個(gè)贊
main 函數(shù)是 goroutine 嗎?
不。
主要功能是一個(gè)功能。
相比之下,
goroutine是一個(gè)輕量級(jí)的執(zhí)行線程。
所以goroutines執(zhí)行的是函數(shù),但是goroutines不是函數(shù),goroutines和函數(shù)之間不是一對(duì)一的關(guān)系。
然而...
該main()
函數(shù)在第一個(gè)(并且僅在啟動(dòng)時(shí))goroutine 中執(zhí)行,goroutine #1
.
但是一旦該函數(shù)調(diào)用另一個(gè)函數(shù),main goroutine 就不再執(zhí)行 main 函數(shù),而是執(zhí)行其他函數(shù)。
所以很明顯 goroutine 和函數(shù)是完全不同的實(shí)體。
不要將 goroutines 與函數(shù)混為一談??!
函數(shù)和協(xié)程是完全不同的概念。而將它們視為同一事物會(huì)導(dǎo)致無數(shù)的困惑和問題。

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超6個(gè)贊
是的,主要功能作為 goroutine(主要的)運(yùn)行。
goroutine 是由 Go 運(yùn)行時(shí)管理的輕量級(jí)線程。?
go f(x, y, z)
?啟動(dòng)一個(gè)新的 goroutine 運(yùn)行f(x, y, z)
f、x、y 和 z 的評(píng)估發(fā)生在當(dāng)前 goroutine中,而執(zhí)行f
發(fā)生在新的 goroutine 中。
Goroutines 運(yùn)行在同一個(gè)地址空間,所以對(duì)共享內(nèi)存的訪問必須是同步的。sync 包提供了有用的原語,盡管在 Go 中你不需要太多,因?yàn)檫€有其他原語。
所以根據(jù)這個(gè)官方文檔,這main
是當(dāng)前的 goroutine。
準(zhǔn)確地說(字面意思)我們可以將 themain
稱為當(dāng)前 goroutine,所以簡單地說它是一個(gè) goroutine。(注意:從字面上看,這main()
是一個(gè)可以作為 goroutine 運(yùn)行的函數(shù)。)
現(xiàn)在讓我們計(jì)算使用的 goroutines 的數(shù)量runtime.NumGoroutine()
:
作為一個(gè)例子,讓我們運(yùn)行 3 個(gè) 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()
}
這里當(dāng)前的 goroutine運(yùn)行新的 goroutine,所以這里我們有多個(gè) goroutine,它再次執(zhí)行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
這里我們有一個(gè)maingoroutine 加上 3 個(gè)名為 goroutines 的用戶main,所以這里的 goroutine 總數(shù)是 4。
讓我們使用main()(一個(gè) goroutine - 不需要同步)來計(jì)算階乘。在線試用:
package main
import "fmt"
func main() {
? ? if f <= 0 {
? ? ? ? fmt.Println(acc)
? ? ? ? return
? ? }
? ? acc *= f
? ? f--
? ? main()
}
var f = 5
var acc = 1
輸出:
120
注意:上面的代碼只是為了清楚地表達(dá)我的觀點(diǎn),不利于生產(chǎn)使用(使用全局變量不應(yīng)該是首選)。

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超9個(gè)贊
是的。Main func 可以生成其他 goroutine,但“main”本身就是一個(gè) 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
}
- 3 回答
- 0 關(guān)注
- 155 瀏覽
添加回答
舉報(bào)