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

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

golang寫(xiě)文件時(shí)阻塞了很多goroutine,為什么不創(chuàng)建很多線(xiàn)程?

golang寫(xiě)文件時(shí)阻塞了很多goroutine,為什么不創(chuàng)建很多線(xiàn)程?

Go
UYOU 2021-09-13 14:23:25
正如我們?cè)?go 中所知道的那樣,當(dāng) goroutine 必須執(zhí)行阻塞調(diào)用(例如系統(tǒng)調(diào)用)或通過(guò) cgo 調(diào)用 C 庫(kù)時(shí),可能會(huì)創(chuàng)建一個(gè)線(xiàn)程。一些測(cè)試代碼:   package main   import (        "io/ioutil"        "os"        "runtime"        "strconv"    )    func main() {        runtime.GOMAXPROCS(2)        data, err := ioutil.ReadFile("./55555.log")        if err != nil {            println(err)            return        }        for i := 0; i < 200; i++ {            go func(n int) {                for {                    err := ioutil.WriteFile("testxxx"+strconv.Itoa(n), []byte(data), os.ModePerm)                    if err != nil {                        println(err)                        break                    }                }            }(i)        }        select {}    }當(dāng)我運(yùn)行它時(shí),它沒(méi)有創(chuàng)建很多線(xiàn)程。? =99=[root /root]$ cat /proc/9616/status | grep -i threadThreads:    5有任何想法嗎?
查看完整描述

3 回答

?
慕標(biāo)5832272

TA貢獻(xiàn)1966條經(jīng)驗(yàn) 獲得超4個(gè)贊

goroutine 是一個(gè)輕量級(jí)線(xiàn)程,它不等同于操作系統(tǒng)線(xiàn)程。的語(yǔ)言規(guī)范指定它作為一個(gè)“相同的地址空間內(nèi)的控制的獨(dú)立并發(fā)線(xiàn)程”

引用 package 的文檔runtime

GOMAXPROCS 變量限制了可以同時(shí)執(zhí)行用戶(hù)級(jí) Go 代碼的操作系統(tǒng)線(xiàn)程的數(shù)量。代表Go代碼在系統(tǒng)調(diào)用中可以阻塞的線(xiàn)程數(shù)沒(méi)有限制;這些不計(jì)入 GOMAXPROCS 限制。

僅僅因?yàn)槟鷨?dòng)了 200 個(gè) goroutine,并不意味著將為它們啟動(dòng) 200 個(gè)線(xiàn)程。您設(shè)置GOMAXPROCS為 2,這意味著可以同時(shí)運(yùn)行 2 個(gè)“活動(dòng)”goroutine。如果 goroutine 被阻塞(例如 I/O 等待),可能會(huì)產(chǎn)生新線(xiàn)程。你沒(méi)有提到你的測(cè)試文件有多大,你開(kāi)始的 goroutines 可能寫(xiě)得太快了。

有效圍棋博客文章將它們定義為:

它們被稱(chēng)為goroutines是因?yàn)楝F(xiàn)有的術(shù)語(yǔ)——線(xiàn)程、協(xié)程、進(jìn)程等——傳達(dá)了不準(zhǔn)確的內(nèi)涵。goroutine 有一個(gè)簡(jiǎn)單的模型:它是一個(gè)與同一地址空間中的其他 goroutine 并發(fā)執(zhí)行的函數(shù)。它是輕量級(jí)的,成本比分配堆??臻g多一點(diǎn)。并且堆棧開(kāi)始時(shí)很小,因此它們很便宜,并且通過(guò)根據(jù)需要分配(和釋放)堆存儲(chǔ)來(lái)增長(zhǎng)。

Goroutines 被多路復(fù)用到多個(gè) OS 線(xiàn)程上,所以如果一個(gè)應(yīng)該阻塞,例如在等待 I/O 時(shí),其他人繼續(xù)運(yùn)行。它們的設(shè)計(jì)隱藏了線(xiàn)程創(chuàng)建和管理的許多復(fù)雜性。


查看完整回答
反對(duì) 回復(fù) 2021-09-13
?
ITMISS

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超8個(gè)贊

該問(wèn)題4056只討論如何限制創(chuàng)建實(shí)際的線(xiàn)程(未夠程)的數(shù)量。


Go 1.2 在commit 665feee 中引入了線(xiàn)程限制管理。


您可以看到一個(gè)測(cè)試,以檢查是否實(shí)際達(dá)到了創(chuàng)建的線(xiàn)程數(shù)pkg/runtime/crash_test.go#L128-L134:


func TestThreadExhaustion(t *testing.T) {

    output := executeTest(t, threadExhaustionSource, nil)

    want := "runtime: program exceeds 10-thread limit\nfatal error: thread exhaustion"

    if !strings.HasPrefix(output, want) {

        t.Fatalf("output does not start with %q:\n%s", want, output)

    }

}

同一個(gè)文件有一個(gè)創(chuàng)建實(shí)際線(xiàn)程的示例(對(duì)于給定的 goroutine),使用runtime.LockOSThread():


func testInNewThread(name string) {

    c := make(chan bool)

    go func() {

        runtime.LockOSThread()

        test(name)

        c <- true

    }()

    <-c

}


查看完整回答
反對(duì) 回復(fù) 2021-09-13
?
胡子哥哥

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超6個(gè)贊

我稍微修改了你的程序以輸出一個(gè)更大的塊


package main


import (

    "io/ioutil"

    "os"

    "runtime"

    "strconv"

)


func main() {

    runtime.GOMAXPROCS(2)

    data := make([]byte, 128*1024*1024)

    for i := 0; i < 200; i++ {

        go func(n int) {

            for {

                err := ioutil.WriteFile("testxxx"+strconv.Itoa(n), []byte(data), os.ModePerm)

                if err != nil {

                    println(err)

                    break

                }

            }

        }(i)

    }

    select {}

}

然后,這會(huì)按您的預(yù)期顯示 >200 個(gè)線(xiàn)程


$ cat /proc/17033/status | grep -i thread

Threads:    203

所以我認(rèn)為系統(tǒng)調(diào)用在您的原始測(cè)試中退出得太快,無(wú)法顯示您期望的效果。


查看完整回答
反對(duì) 回復(fù) 2021-09-13
  • 3 回答
  • 0 關(guān)注
  • 538 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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