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

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

去達到進程的最大線程數?

去達到進程的最大線程數?

Go
慕少森 2021-07-09 14:25:45
我正在嘗試使用 Go 進行一些文件系統使用分析,并且通過將幾乎所有內容生成為 goroutine 并依靠 Go VM(和 GOMAXPROCS)來管理它來盡可能快地編寫代碼。我一直在看著這段代碼運行(非??欤钡剿V惯\行。我檢查了頂部,它列出了我的進程有 1500 個線程。我想也許我已經達到了一些限制,因此該進程在等待操作系統時陷入僵局。我檢查了我的操作系統 (FreeBSD) 限制,果然它被列為每個進程最多 1500 個線程。很驚訝,我檢查了 Go 文檔,它說 GOMAXPROCS 只是對運行線程的限制,但阻塞的線程不計算在內。所以我的問題:可以說我不能依靠 Go VM 作為全局池來防止達到這些類型的操作系統限制嗎?有沒有一種慣用的方法來處理這個問題(好吧,這只是我使用 Go 的第二天)?特別是,當我使用完頻道后,除了同步關閉頻道之外,我還沒有找到其他好方法。有沒有更好的辦法?我想抽象掉樣板(與 go 例程并行映射并在完成后關閉通道),是否有一種類型安全的方法可以在沒有泛型的情況下做到這一點?這是我當前的代碼:func AnalyzePaths(paths chan string) chan AnalyzedPath {    analyzed := make(chan AnalyzedPath)    go func() {        group := sync.WaitGroup{}        for path := range paths {            group.Add(1)            go func(path string) {                defer group.Done()                analyzed <- Analyze(path)            }(path)        }        group.Wait()        close(analyzed)    }()    return analyzed}func GetPaths(roots []string) chan string {    globbed := make(chan string)    go func() {        group := sync.WaitGroup{}        for _, root := range roots {            group.Add(1)            go func(root string) {                defer group.Done()                for _, path := range glob(root) {                    globbed <- path                }            }(root)        }        group.Wait()        close(globbed)    }()    return globbed}func main() {    paths := GetPaths(patterns)    for analyzed := range AnalyzePaths(paths) {        fmt.Println(analyzed)    }}
查看完整描述

1 回答

?
斯蒂芬大帝

TA貢獻1827條經驗 獲得超8個贊

大約 2 個月前(或更多)語言開發人員談到侵入線程計數控制(和一些其他限制)。所以我們可以期待很快看到它。一個月或更長時間前,我開發了這個問題,在我的 linux 機器上發現 GOMAXPROCS 沒有超過 256 的值。如果我向它發送 300 或更多,結果總是 256。但我發現 goroutines 不是線程。Goroutines 可以存在于一個線程中。


至于慣用同步 - 我認為沒有必要同步太多。在我的代碼中,我通常使用 goroutine 僅通過通道進行通信的想法。通道應該作為 goroutine 的參數傳遞。


func main() {

    ch1 := make(chan SomeType1)

    ch2 := make(chan SomeType2)

    go generator(ch1, ch2)

    go processor(ch1, ch2)

    // here main func becomes waiting until it capture 2 of ch2-finished-signals 

    <- ch2

    <- ch2

    // usually we don't need the exact values of ch2-signals,

    // so we assign it to nothing 

}


func generator(ch1 chan SomeType1, ch2 chan SomeType2) {

    for (YOUR_CONDITION){

        // generate something

        //....

        // send to channel

        ch1 <- someValueOfType1

    }

    ch1 <- magicStopValue

    ch2 <- weAreFinishedSignal1

}


func processor(ch1 chan SomeType1, ch2 chan SomeType2) {

    // "read" value from ch1 

    value := <-ch1

    for value != magicStopValue {

        // make some processing

        // ....

        //get next value from ch1 and replay processing

        value = <- ch1

    }

    // here we can send signal that goroutine2 is finished

    ch2 <- weAreFinishedSignal2

}

如果 goroutines 在一個線程中,它們的通信速度會更快。對我來說,通道性能差得很遠,但足以滿足多種用途。


查看完整回答
反對 回復 2021-07-12
  • 1 回答
  • 0 關注
  • 223 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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