Hey guys! I have written my first app on golang - and all works fine except one - I use worker pools to run tasks in parallel, and I have noticed that not all gorutines waiting to be executed. I used this example:
func (provider *GoogleDriveProvider) FetchVideos() {
resp, _ := provider.SheetService.Spreadsheets.Values.Get(provider.SpreadsheetId, provider.SpreadsheetRange).Do()
jobs := make(chan *googleSheetsVideo, googleWorkersAmount)
for i := 0; i < googleWorkersAmount; i++ {
go provider.executeWork(jobs)
}
for _, row := range resp.Values {
if len(row) <= minRowLengthForSheets {
continue
}
dataSets := provider.getDataSets(row)
for _, sheetsVideo := range dataSets {
jobs <- sheetsVideo
}
}
close(jobs)
provider.Logger.Info("Obtaining videos from google Drive is finished, good job!")
}
func (provider *GoogleDriveProvider) executeWork(jobs <-chan *googleSheetsVideo) {
for sheetsVideo := range jobs {
googleVideoFile, _ := sheetsVideo.fetchVideoData()
provider.buildVideo(googleVideoFile, sheetsVideo)
provider.Logger.Info("Video saved")
}
}
So I expected - the last message in the console will be - “Obtaining videos from google Drive is finished, good job!”, but instead it I see
"Obtaining videos from google Drive is finished, good job!
“Video saved”
“Video saved”
I have tried little bit rewrite code, and followed all steps from the above link (added result channel):
func (provider *GoogleDriveProvider) FetchVideos() {
resp, _ := provider.SheetService.Spreadsheets.Values.Get(provider.SpreadsheetId, provider.SpreadsheetRange).Do()
jobs := make(chan *googleSheetsVideo, googleWorkersAmount)
results := make(chan int, googleWorkersAmount)
for i := 0; i < googleWorkersAmount; i++ {
go provider.executeWork(jobs, results)
}
counter:=0
for _, row := range resp.Values {
if len(row) <= minRowLengthForSheets {
continue
}
counter++
dataSets := provider.getDataSets(row)
for _, sheetsVideo := range dataSets {
jobs <- sheetsVideo
}
}
provider.Logger.WithFields(logFields).Info("DEBUGGGGGGG")
for a := 0; a < counter; a++ {
<-results
}
close(jobs)
provider.Logger.Info("Obtaining videos from google Drive is finished, good job!")
}
func (provider *GoogleDriveProvider) executeWork(jobs <-chan *googleSheetsVideo, results chan<- int) {
for sheetsVideo := range jobs {
googleVideoFile, _ := sheetsVideo.fetchVideoData()
video, _ := provider.buildVideo(googleVideoFile, sheetsVideo)
results <- 1
provider.Logger.WithFields(logrus.Fields{
"fileName": video.FileName,
}).Info("video saved")
}
}
In this case, my program is hung, I don`t see any errors, or even my debug message “DEBUGGGGGGG”. Could somebody explain what is wrong?
P.S I know about waitgroup, but I want to figure out how works worker pools