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

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

Golang:如何捕獲大規(guī)模并行基準(zhǔn)測(cè)試的返回值(>100萬(wàn)個(gè)任務(wù))?

Golang:如何捕獲大規(guī)模并行基準(zhǔn)測(cè)試的返回值(>100萬(wàn)個(gè)任務(wù))?

Go
藍(lán)山帝景 2022-09-19 17:30:02
我正在構(gòu)建一個(gè)參數(shù)優(yōu)化器,它基本上生成配置,對(duì)所有配置進(jìn)行基準(zhǔn)測(cè)試,收集所有結(jié)果,對(duì)它們進(jìn)行排序,然后選擇相對(duì)于基準(zhǔn)測(cè)試結(jié)果的最佳性能配置?;鶞?zhǔn)測(cè)試本身工作正常,但每次運(yùn)行需要 50 毫秒和 2 秒,具體取決于配置。關(guān)鍵是,優(yōu)化程序生成了非常大量的配置,這意味著,在最低端的 100k 和高端的大約 4000 萬(wàn)之間,大約 100 萬(wàn)到 500 萬(wàn)是一個(gè)很好的正常范圍。顯然,單線程版本需要永遠(yuǎn),CPU負(fù)載實(shí)際上非常低,因?yàn)槿蝿?wù)相對(duì)較輕。我已經(jīng)設(shè)計(jì)了基準(zhǔn)測(cè)試,以使其與并發(fā)性很好地配合使用,也就是說(shuō),運(yùn)行器被封裝在一個(gè)單獨(dú)的結(jié)構(gòu)(稱為代理)中,基準(zhǔn)測(cè)試本質(zhì)上是一個(gè)將所有狀態(tài)作為參數(shù)的純函數(shù)。從本質(zhì)上講,每次運(yùn)行都會(huì)創(chuàng)建自己的狀態(tài),然后獨(dú)立于所有其他運(yùn)行,但所有函數(shù)都使用相同的(引用的)共享數(shù)據(jù)集。該函數(shù)如下所示。但是,我很難處理每個(gè)基準(zhǔn)測(cè)試的返回值?;氐竭^(guò)去,在“縮放”中,我們使用 Async / Await 來(lái)實(shí)現(xiàn)任務(wù)并行性,然后讓結(jié)果繼續(xù)。Go 例程,afaik 只能很好地與沒(méi)有返回值的函數(shù)一起使用。在實(shí)踐中,通道是從戈魯廷獲取值的最自然方式。這就是我正在考慮的關(guān)鍵:考慮到我通常有>100萬(wàn)個(gè)任務(wù),如何正確有效地捕獲返回值?與此相關(guān)的是,Golang實(shí)際上有一個(gè)非常快速的參數(shù)優(yōu)化器嗎?對(duì)于蟒蛇,我記得optum提供了出色的結(jié)果。謝謝func (a *Agent) runOptimization(strategyConfigs []cmdb.Config) (result *bmx.OptimizeResult) {scores := make([]bmx.BackTestResult, len(strategyConfigs))println("Run all benchmarks")for i, config := range strategyConfigs {    state := newState(&config)    score := a.runBenchmark(state)    scores[i] = *score // sort only works on actual values}println("Sort results")sort.Sort(bmx.ByTotalPnL(scores))println("Select best config")best := scores[len(scores)-1]println("Generate best strategy config")stratConf := a.getStrategyConfig(best.PatternConfig)println("Return optimization results ")result = &bmx.OptimizeResult{    Symbol:          best.Symbol,    StrategyType:    best.StrategyType,    OptimizedConfig: &stratConf,    ...}    return result } 
查看完整描述

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ù)。runBenchmarkchan *score

代碼段是這樣滾動(dòng)的:

  1. 創(chuàng)建通道以交換類型為 的值。*score

  2. 開(kāi)始運(yùn)行-我想-“一個(gè)代理人”的metod的戈魯丁。
    該方法通過(guò)提交給它的通道發(fā)送(指向)它計(jì)算的對(duì)象并退出。runBenchmarkscore

  3. 另一個(gè)循環(huán)執(zhí)行與生成的 goroutines 一樣多的通道接收,并將每個(gè)接收的值放入生成的切片中。

警告:

  • 這預(yù)先假定在多個(gè)戈魯丁同時(shí)運(yùn)行的情況下執(zhí)行它是可以的。arunBenchmark

    如果不能,你將需要?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è)指針。


查看完整回答
反對(duì) 回復(fù) 2022-09-19
  • 1 回答
  • 0 關(guān)注
  • 84 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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