1 回答

TA貢獻(xiàn)2041條經(jīng)驗(yàn) 獲得超4個(gè)贊
有多種方法可以做到這一點(diǎn)。
一本“教科書(shū)”是這樣的:
results := make(chan *score)
for i, config := range strategyConfigs {
state := newState(&config)
go a.runBenchmark(state, results)
}
for i := 0; i < len(strategyConfigs); i++ {
scores[i] = <-results
}
...,然后修改方法以不返回任何值,并接受類型的第二個(gè)參數(shù)。runBenchmark
chan *score
代碼段是這樣滾動(dòng)的:
創(chuàng)建通道以交換類型為 的值。
*score
開(kāi)始運(yùn)行-我想-“一個(gè)代理人”的metod的戈魯丁。
該方法通過(guò)提交給它的通道發(fā)送(指向)它計(jì)算的對(duì)象并退出。runBenchmark
score
另一個(gè)循環(huán)執(zhí)行與生成的 goroutines 一樣多的通道接收,并將每個(gè)接收的值放入生成的切片中。
警告:
這預(yù)先假定在多個(gè)戈魯丁同時(shí)運(yùn)行的情況下執(zhí)行它是可以的。
a
runBenchmark
如果不能,你將需要?jiǎng)?chuàng)建一個(gè)單獨(dú)的來(lái)運(yùn)行每個(gè)單獨(dú)的戈魯廷。
鑒于你的例子不是太小,我很難對(duì)它有多難/多簡(jiǎn)單做出有根據(jù)的猜測(cè)。
如果您需要這方面的幫助,請(qǐng)單獨(dú)提出一個(gè)狹隘的問(wèn)題。a
如果你有,比如,數(shù)億個(gè)“策略配置”,這種方法會(huì)過(guò)于簡(jiǎn)單,因?yàn)樗械膅oroutines都會(huì)一次生成,a)這是浪費(fèi)資源;b)如果數(shù)字太大,甚至可能失敗。
教科書(shū)上的解決方法是使用所謂的“扇出” - 當(dāng)你有一個(gè)戈魯廷通過(guò)一個(gè)通道接收“任務(wù)”并將它們分配到有限數(shù)量的工人大流子上時(shí),這些工人戈魯廷始終保持在一定限制以下。你可以從這里開(kāi)始。
另一種方法是利用這樣一個(gè)事實(shí),即在Go中,數(shù)組的每個(gè)元素(和切片 - 通過(guò)擴(kuò)展)都被視為一個(gè)單獨(dú)的變量。這意味著從工作線程中同時(shí)更新生成的切片的各個(gè)元素是可以的 - 只要切片是預(yù)先分配的并且永遠(yuǎn)不會(huì)重新分配(使用,重新切片等操作),而此過(guò)程正在進(jìn)行中。append
為了演示,讓我們使用“等待組”:
import "sync"
var wg sync.WaitGroup
scores := make([]*score, len(strategyConfigs))
wg.Add(len(strategyConfigs))
for i, config := range strategyConfigs {
state := newState(&config)
go a.runBenchmark(state, &scores[i], &wg)
}
wg.Wait()
應(yīng)將方法修改為具有runBenchmark
defer wg.Done()
作為其第一個(gè)語(yǔ)句,并接受兩個(gè)附加參數(shù) — 類型和 。*score
*sync.WaitGroup
在這里,開(kāi)始在單獨(dú)的 goroutine 中運(yùn)行,并傳遞要更新其結(jié)果的元素的地址和等待組的地址以發(fā)出“任務(wù)完成”信號(hào)。runBenchmark
請(qǐng)注意,基本上與第一種情況下相同的警告適用。
如您所見(jiàn),戈魯廷確實(shí)不返回任何值。這主要是因?yàn)楫?dāng)它可能的時(shí)候,產(chǎn)生它的戈魯廷可能早已消失,并且沒(méi)有地方可以返回該值。
因此,基本上有兩種方法可以“獲取數(shù)據(jù)”:
在通道上發(fā)送該值(并從該通道接收其他一些戈魯?。?。
這是Go的面包和黃油。我建議從這種方法開(kāi)始,并使用它,直到你對(duì)它感到完全舒服。
更新內(nèi)存中的某個(gè)位置,前提是沒(méi)有其他 goroutine 執(zhí)行相同的操作(否則您將遇到數(shù)據(jù)競(jìng)賽)。
在某些情況下,這種方法可能更快(甚至更簡(jiǎn)單,對(duì)某些人來(lái)說(shuō)),但這種代碼背后的原因可能更難看出。
您可以從這個(gè)開(kāi)始,了解基本概念。
總而言之,有幾個(gè)指針。
我建議在掌握其基礎(chǔ)知識(shí)之前,不要開(kāi)始編寫(xiě)涉及并發(fā)的幾乎不嚴(yán)重的代碼。
請(qǐng)從圍棋之旅的相關(guān)部分開(kāi)始,然后轉(zhuǎn)到圍棋博客:
首先嘗試使用更簡(jiǎn)單的示例。
- 1 回答
- 0 關(guān)注
- 84 瀏覽
添加回答
舉報(bào)