此代碼的作用該代碼從 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
- 1 回答
- 0 關注
- 89 瀏覽
添加回答
舉報
0/150
提交
取消