Maison > Article > développement back-end > Gestion et optimisation du pool de coroutines Golang
Le pool de coroutines est un mécanisme permettant un traitement efficace des tâches. Les tâches sont exécutées simultanément via des coroutines dans le pool (appelées « workers »). Le pool de coroutines peut être optimisé en ajustant le nombre de coroutines, en utilisant des canaux mis en mémoire tampon, en fermant le pool de coroutines et en surveillant ses métriques. En pratique, le pool de coroutines peut être utilisé pour traiter des tâches de traitement d'image. En soumettant des tâches au pool de coroutines, l'efficacité de la simultanéité du traitement d'image peut être améliorée.
Gestion et optimisation du pool de coroutines GoLang
Présentation du pool de coroutines
Le pool de coroutines est un mécanisme de gestion des groupes de coroutines, qui peut aider à éviter de créer et de détruire des frais généraux de coroutines. Les coroutines d'un pool de coroutines sont appelées « travailleurs » et traitent les tâches entrantes.
Avantages du pool de coroutines
Implémentation du pool de coroutines
Dans GoLang, vous pouvez créer un pool de coroutines pour implémenter le traitement des tâches simultanées :
package main import ( "fmt" "sync" "time" ) type Job struct { Data int Result chan int } func main() { // 创建一个有缓冲的通道用于处理任务结果 result := make(chan int, 10) // 创建一个协程池 var wg sync.WaitGroup pool := make(chan *Job) for i := 0; i < 4; i++ { wg.Add(1) go func(pool chan *Job, wg *sync.WaitGroup) { defer wg.Done() for { job := <-pool job.Result <- job.Data * job.Data } }(pool, &wg) } // 模拟任务处理 for i := 0; i < 10; i++ { job := Job{ Data: i, Result: result, } pool <- &job } close(pool) wg.Wait() close(result) // 打印任务结果 for r := range result { fmt.Println(r) } }
Optimisation du pool de coroutines
Voici quelques conseils pour optimiser le pool de coroutines :
close()
pour le fermer et libérer toutes les coroutines. Cas pratique
Dans le cas pratique suivant, le pool de coroutines est utilisé pour gérer des tâches de traitement d'image :
package main import ( "fmt" "sync" "time" "image" "image/jpeg" "os" ) type Job struct { ImageFile string ResultImage chan<- image.Image } func main() { resultChan := make(chan image.Image) // 创建一个协程池 var wg sync.WaitGroup pool := make(chan *Job) for i := 0; i < 4; i++ { wg.Add(1) go func(pool chan *Job, wg *sync.WaitGroup) { defer wg.Done() for { job := <-pool image, err := loadAndProcessImage(job.ImageFile) if err != nil { fmt.Println(err) continue } job.ResultImage <- image } }(pool, &wg) } // 将图像处理任务提交给协程池 for { imageFile, ok := <-filesChan // 从文件通道取文件 if !ok { break } job := Job{ ImageFile: imageFile, ResultImage: resultChan, } pool <- &job } close(pool) wg.Wait() close(resultChan) // 保存处理后的图像 for img := range resultChan { outputFile, err := os.Create("processed_" + imgFile) if err != nil { fmt.Println(err) continue } if err := jpeg.Encode(outputFile, img, &jpeg.Options{Quality: 95}); err != nil { fmt.Println(err) outputFile.Close() continue } outputFile.Close() } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!