亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在戈魯丁人之間同時劃分任務

在戈魯丁人之間同時劃分任務

Go
飲歌長嘯 2022-08-24 17:20:53
此代碼的作用該代碼從 Postgresql 數據庫獲取數據。從所有數據中,只有兩個字段(會話和文本)被添加到 。Task Struct我的數據庫中只有2個(每個)提到的數據,這意味著在做a時會返回我作為輸出。len(task)2現在從這里開始,問題是什么:我制作了一個長度等于任務結構的長度(在本例中為 2)。buffered channel ch我指定允許的最大工作線程(線程)數,此處為 20。下面的代碼所做的是,當我將任務發送到通道時,發送(此處為2)中的所有元素,并且任務結構中的示例代碼將打印所有元素兩次(=任務結構的長度)。示例顯示在末尾。Task struct我需要什么才能讓這個程序做什么例如,通道中有 100 個數據。我想將這100個數據分成20個Goroutines,每個Goroutines將處理5個數據(我不知道這是否可能,如果這無效,請提供其他解決方案)。len(task) = 100因此,100個數據將提供給20個工人,他們將每人接收5個數據并與他們一起運行任務,最后通道將關閉,僅此而已。當數據庫變大并且當前也變大時,這將很有幫助。哪個會更好 20 個 Worker 分別執行任務,或者使 Worker 的數量等于通道中的數據數量?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貢獻1877條經驗 獲得超6個贊

更改任務通道類型。

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

這意味著在通道上傳遞的每個值都表示單個任務。


簡化渠道迭代

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

        go func() {

            defer wg.Done()

            for t := range ch {

                DoTask(t)

            }

        }()

    }

wg.Done()現在將在工作線程退出時運行。 將在通道關閉并消耗所有任務后停止。range ch


更改“Do”功能以匹配

func DoTask(t Task) {

關于如何選擇工作人員數量:


為函數運行一些基準測試,并嘗試更改(或將其作為參數傳遞)。最佳值將取決于任務以及運行函數時的可用資源,這意味著今天機器上的最佳值可能不是其他任何機器上的最佳值,也不是明天機器上的最佳值?;鶞蕼y試應該可以幫助您找到一個很好的近似范圍來放置值。FetchAllDataMAX_WORKERS


查看完整回答
反對 回復 2022-08-24
  • 1 回答
  • 0 關注
  • 89 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號