3 回答

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

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

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