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

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

在戈魯丁人之間同時(shí)劃分任務(wù)

在戈魯丁人之間同時(shí)劃分任務(wù)

Go
飲歌長(zhǎng)嘯 2022-08-24 17:20:53
此代碼的作用該代碼從 Postgresql 數(shù)據(jù)庫(kù)獲取數(shù)據(jù)。從所有數(shù)據(jù)中,只有兩個(gè)字段(會(huì)話和文本)被添加到 。Task Struct我的數(shù)據(jù)庫(kù)中只有2個(gè)(每個(gè))提到的數(shù)據(jù),這意味著在做a時(shí)會(huì)返回我作為輸出。len(task)2現(xiàn)在從這里開(kāi)始,問(wèn)題是什么:我制作了一個(gè)長(zhǎng)度等于任務(wù)結(jié)構(gòu)的長(zhǎng)度(在本例中為 2)。buffered channel ch我指定允許的最大工作線程(線程)數(shù),此處為 20。下面的代碼所做的是,當(dāng)我將任務(wù)發(fā)送到通道時(shí),發(fā)送(此處為2)中的所有元素,并且任務(wù)結(jié)構(gòu)中的示例代碼將打印所有元素兩次(=任務(wù)結(jié)構(gòu)的長(zhǎng)度)。示例顯示在末尾。Task struct我需要什么才能讓這個(gè)程序做什么例如,通道中有 100 個(gè)數(shù)據(jù)。我想將這100個(gè)數(shù)據(jù)分成20個(gè)Goroutines,每個(gè)Goroutines將處理5個(gè)數(shù)據(jù)(我不知道這是否可能,如果這無(wú)效,請(qǐng)?zhí)峁┢渌鉀Q方案)。len(task) = 100因此,100個(gè)數(shù)據(jù)將提供給20個(gè)工人,他們將每人接收5個(gè)數(shù)據(jù)并與他們一起運(yùn)行任務(wù),最后通道將關(guān)閉,僅此而已。當(dāng)數(shù)據(jù)庫(kù)變大并且當(dāng)前也變大時(shí),這將很有幫助。哪個(gè)會(huì)更好 20 個(gè) Worker 分別執(zhí)行任務(wù),或者使 Worker 的數(shù)量等于通道中的數(shù)據(jù)數(shù)量?var wg sync.WaitGrouptype Task struct {    FetchedSession string    FetchedText    string}func FetchAllData() {    var task []Task    //Fetch Session from DB    var sess []database.UserSession    database.DB.Find(&sess)    //Fetch CommentText from DB    var cmt []database.CommentReq    database.DB.Find(&cmt)    if len(sess) == len(cmt) {        for i := range sess {            task = append(task, Task{FetchedSession: sess[i].Session, FetchedText: cmt[i].CommentText})        }    }    //making the Task Channel    ch := make(chan []Task, len(task))    MAX_WORKERS := 20    wg.Add(MAX_WORKERS)    for i := 0; i < MAX_WORKERS; i++ {        go func() {            for {                t, ok := <-ch                if !ok {                    wg.Done()                    return                }                DoTasks(t)            }        }()    }    for i := 0; i < len(task); i++ {        ch <- task    }    close(ch)    wg.Wait()}//Since Total number of data in Database is 2 (rows)//Currently this function takes all data from the channel and runs Twicefunc DoTasks(t []Task) {    //Total tasks (data) = 100    //If Max Workers = 20, then this function will run 5 times    //Each Goroutine will get 4 tasks from the channel    // Get the FetchedSession and FetchedTask and do tasks    fmt.Println(t) // This prints all data twice    //Finish one task and continue with the second}
查看完整描述

1 回答

?
慕哥9229398

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超6個(gè)贊

更改任務(wù)通道類型。

ch := make(chan Task, len(task))

這意味著在通道上傳遞的每個(gè)值都表示單個(gè)任務(wù)。


簡(jiǎn)化渠道迭代

    for i := 0; i < MAX_WORKERS; i++ {

        go func() {

            defer wg.Done()

            for t := range ch {

                DoTask(t)

            }

        }()

    }

wg.Done()現(xiàn)在將在工作線程退出時(shí)運(yùn)行。 將在通道關(guān)閉并消耗所有任務(wù)后停止。range ch


更改“Do”功能以匹配

func DoTask(t Task) {

關(guān)于如何選擇工作人員數(shù)量:


為函數(shù)運(yùn)行一些基準(zhǔn)測(cè)試,并嘗試更改(或?qū)⑵渥鳛閰?shù)傳遞)。最佳值將取決于任務(wù)以及運(yùn)行函數(shù)時(shí)的可用資源,這意味著今天機(jī)器上的最佳值可能不是其他任何機(jī)器上的最佳值,也不是明天機(jī)器上的最佳值?;鶞?zhǔn)測(cè)試應(yīng)該可以幫助您找到一個(gè)很好的近似范圍來(lái)放置值。FetchAllDataMAX_WORKERS


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

添加回答

舉報(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)