Récapitulatif - Worker Pool
Fait partie de la section Programmation Orientée Objet du Journey GO de Coddy — leçon 66 sur 107.
Défi
FacileConstruisons un système de traitement de tâches en utilisant le modèle de pool de travailleurs (worker pool) ! Vous allez créer un pool de travailleurs qui traitent simultanément des tâches de calcul, démontrant ainsi comment les canaux (channels), les goroutines et les WaitGroups collaborent pour gérer efficacement les charges de travail.
Vous organiserez votre code sur deux fichiers :
pool.go: Définissez vos composants et la logique de votre pool de travailleurs.Créez une structure
Taskavec les champsID(int) etValue(int) représentant le travail à effectuer.Créez une structure
Resultavec les champsTaskID(int) etComputed(int) représentant le travail terminé.Implémentez une fonction
Workerqui prend un ID de travailleur (int), un canal de tâches en réception seule (<-chan Task), un canal de résultats en envoi seul (chan<- Result), et un pointeur vers unsync.WaitGroup. Chaque travailleur doit :- Utiliser
defer wg.Done()pour signaler la fin de son exécution - Parcourir le canal des tâches avec
rangepour traiter chaque tâche - Pour chaque tâche, calculer le carré de la
Valuede la tâche - Envoyer un
Resultavec leTaskIDet le carré calculé
Implémentez une fonction
RunPoolqui prend le nombre de travailleurs (int) et une tranche (slice) de tâches. Cette fonction doit :- Créer des canaux tamponnés (buffered channels) pour les tâches et les résultats (utilisez le nombre de tâches comme taille de tampon)
- Démarrer le nombre spécifié de travailleurs en tant que goroutines
- Envoyer toutes les tâches dans le canal des tâches, puis le fermer
- Utiliser une goroutine avec le
WaitGrouppour fermer le canal des résultats une fois que tous les travailleurs ont terminé - Collecter tous les résultats dans une tranche et la retourner
- Utiliser
main.go: Lire l'entrée et coordonner le pool de travailleurs.Lisez le nombre de travailleurs, puis le nombre de tâches. Pour chaque tâche, lisez son ID et sa valeur. Appelez
RunPoolavec les travailleurs et les tâches, puis affichez chaque résultat au format :Task [TaskID]: [Computed]Affichez les résultats triés par
TaskIDpar ordre croissant.
Les entrées suivantes seront fournies :
- Ligne 1 : Nombre de travailleurs (entier)
- Ligne 2 : Nombre de tâches (entier)
- Lignes suivantes : Pour chaque tâche, deux lignes - l'ID de la tâche (entier), puis sa valeur (entier)
Par exemple, pour :
2
4
1
3
2
5
3
2
4
7Votre sortie devrait être :
Task 1: 9
Task 2: 25
Task 3: 4
Task 4: 49Les travailleurs traitent les tâches de manière concurrente (3 au carré vaut 9, 5 au carré vaut 25, etc.), et les résultats sont collectés et affichés dans l'ordre par ID de tâche. Avec 2 travailleurs gérant 4 tâches, le travail est réparti efficacement dans le pool.
Essayez vous-même
package main
import (
"fmt"
"sort"
)
func main() {
// Lire le nombre de travailleurs
var numWorkers int
fmt.Scanln(&numWorkers)
// Lire le nombre de tâches
var numTasks int
fmt.Scanln(&numTasks)
// Lire les tâches
tasks := make([]Task, numTasks)
for i := 0; i < numTasks; i++ {
var id, value int
fmt.Scanln(&id)
fmt.Scanln(&value)
tasks[i] = Task{ID: id, Value: value}
}
// TODO: Appeler RunPool avec les travailleurs et les tâches
// TODO: Trier les résultats par TaskID par ordre croissant
// TODO: Afficher chaque résultat au format : Task [TaskID]: [Computed]
}
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO en Go
Fichiers externesEspace de travail et Modules GoPackages et ImportsNoms exportés vs non exportésIntroduction à la POO en GoLes Structs comme ClassesDéfinir des méthodes sur les StructsReceveurs par pointeur vs par valeurInitialisation de StructsFonctions constructeursRécapitulatif - Calculatrice simple4Interfaces
Introduction aux interfacesImplémentation impliciteL'interface comme contratInterface vide (any)Assertion de typeType SwitchComposition d'interfacesInterfaces Stringer & ErrorRécapitulatif - Calculateur de formes7Encapsulation
Champs exportés vs non exportésEncapsulation au niveau du packageMéthodes Getter & SetterMasquage d'informations en GoRécapitulatif - Dossiers étudiants10Génériques (Go 1.18+)
Introduction aux génériquesParamètres de typeContraintes de typeStructures génériquesContournement pour les méthodes génériquesRécapitulatif - Collections génériques13Patrons de conception, Partie 1
Introduction aux Design PatternsPatron SingletonPatron FactoryPatron Abstract FactoryPatron ObserverPatron Strategy2Exploration approfondie des Types et Structs
Types de base et compositesDéfinitions de types personnalisésTags de StructStructs anonymesStructs imbriquéesValeurs par défaut et Zero ValuesRécapitulatif - Carnet de contacts5Composition plutôt qu'héritage
Pourquoi Go n'a pas d'héritageLes bases de l'imbrication de structsPromotion de méthodesImbriquer plusieurs structsImbrication vs AgrégationMasquage de méthodes imbriquéesRécapitulatif - Hiérarchie des employés8Gestion des erreurs & POO
L'interface errorTypes d'erreurs personnalisésError Wrapping (fmt.Errorf)Erreurs sentinelleserrors.Is() et errors.As()Panic, Defer et RecoverRécapitulatif - File Parser11Bibliothèque standard et POO
io.Reader & io.WriterL'interface sort.InterfaceL'interface fmt.Stringerencoding/json avec les StructsL'interface http.HandlerRécapitulatif - Modèles d'API REST14Patrons de conception, Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Template MethodPatron ÉtatPatron CompositeMiddleware en tant que Décorateur3Pointeurs et Mémoire
Bases des pointeurs en GoPointeurs vers des structsPassage par valeur vs référenceLa fonction new()Garbage Collection en GoRécapitulatif - Constructeur de liste chaînée6Le polymorphisme en Go
Le polymorphisme via les interfacesLe Duck Typing en GoRègles de satisfaction des interfacesCollections polymorphesInjection de dépendancesRécapitulatif - Processeur de paiement9Concurrence et POO
Bases des GoroutinesChannels et CommunicationChannels avec buffer vs sans bufferL'instruction Selectsync.Mutex et sync.RWMutexsync.WaitGroupConception de structures Thread-SafeRécapitulatif - Worker Pool