3 回答

TA貢獻(xiàn)2080條經(jīng)驗 獲得超4個贊
hobbs 和 creker 的回答尤其出色,但我覺得還有很多話要說。
有一個非常普遍的概念,即 WaitGroup 是管理多個 goroutines的方式——它肯定是常用的,在許多情況下甚至是慣用的。你知道嗎?能夠調(diào)用 thread.join() 確實可能比處理 WaitGroups 更好,因為它只是在等待之前啟動的一堆線程/goroutines。
但有這么多到比Go的并發(fā)模型。
Goroutines 專門設(shè)計為沒有所有權(quán)、層次結(jié)構(gòu)或句柄的概念。他們獨立、平等并負(fù)責(zé)結(jié)束自己的執(zhí)行。這與強(qiáng)大的并發(fā)原語相結(jié)合,賦予 Go 模型幾乎無與倫比的靈活性。
因此,如果您發(fā)現(xiàn)自己幾乎每次使用 goroutine 時都在使用 WaitGroup,那么您可能沒有在建模和構(gòu)建程序時利用并發(fā)性- 更有可能您只是在使用 goroutine 來并行化計算。
為了更直接地回答您的問題,與 thread.join() 之類的東西相比,WaitGroups 相當(dāng)原始,但是原始的低級構(gòu)建塊對于 Go 的并發(fā)模型更有用。畢竟,goroutines 不是線程,它們的使用方式并不完全相同。

TA貢獻(xiàn)1906條經(jīng)驗 獲得超3個贊
為什么它是這樣設(shè)計的
這實際上已經(jīng)被 golang 團(tuán)隊解釋了很多次——為什么我們不能殺死 goroutines,為什么它們沒有我們可以讀取的 ID,為什么我們不能像線程的Join
.
它被解釋了多次,但我只能找到這個?;旧?,作者不希望你依賴線程局部性——鎖定特定的線程/goroutine,只為它擁有一個本地存儲等等。當(dāng)你沒有任何方法知道你實際上在哪個 goroutine 中運行您被迫以真正并發(fā)的方式設(shè)計您的應(yīng)用程序。您的代碼由真正獨立的部分組成,這些部分同時運行,它們并不關(guān)心具體如何。您不在乎哪個 goroutine 接收您的代碼,也不在乎哪個操作系統(tǒng)線程正在運行您的代碼。這就是通道、選擇和其他原語的用武之地。它們可以幫助您以這種方式構(gòu)建應(yīng)用程序。而且我相信它不會就此止步。

TA貢獻(xiàn)1803條經(jīng)驗 獲得超6個贊
不,這只是不同的事情做不同的事情。它們甚至沒有真正的可比性,因為 aWaitGroup
本質(zhì)上等待多個事物(并且可以在其生命周期內(nèi)添加事物)而 python 線程join
總是只等待那一件事。
也就是說,Go 的庫更多地是為您提供做更高級的事情所需的原始東西,而 Python 的庫更多的是“包含電池”的理念。使用 Go 給你的東西,你可以創(chuàng)建一個有點像 python 的類型Thread
。這可能不是使用 Go 的最佳方式,但如果您愿意,可以使用工具來完成它。然而,標(biāo)準(zhǔn)庫不會對這樣的事情進(jìn)行標(biāo)準(zhǔn)化。
- 3 回答
- 0 關(guān)注
- 209 瀏覽
添加回答
舉報