第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

main 函數(shù)是否運(yùn)行一個(gè) goroutine?

main 函數(shù)是否運(yùn)行一個(gè) goroutine?

Go
慕的地8271018 2023-05-08 18:02:30
該main()函數(shù)是 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貢獻(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ù)的困惑和問題。


查看完整回答
反對(duì) 回復(fù) 2023-05-08
?
30秒到達(dá)戰(zhàn)場

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)該是首選)。


查看完整回答
反對(duì) 回復(fù) 2023-05-08
?
暮色呼如

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

}


查看完整回答
反對(duì) 回復(fù) 2023-05-08
  • 3 回答
  • 0 關(guān)注
  • 155 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)