Récapitulatif - Pool de workers
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 des tâches à l'aide du modèle de pool de workers ! Vous allez créer un pool de workers qui traitent simultanément des tâches de calcul, afin de montrer comment les canaux, les goroutines et les WaitGroups fonctionnent ensemble pour gérer efficacement les charges de travail.
Vous organiserez votre code sur deux fichiers :
pool.go: définir les composants et la logique de votre pool de workers.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 worker (int), un canal de réception de tâches (<-chan Task), un canal d'envoi des résultats (chan<- Result) et un pointeur vers unsync.WaitGroup. Chaque worker doit :- Utiliser
defer wg.Done()pour signaler la fin de son exécution - Parcourir le canal de tâches pour traiter chaque tâche
- Pour chaque tâche, calculer le carré de sa valeur
- Envoyer un Result contenant le TaskID et le carré calculé
Implémentez une fonction
RunPoolqui prend le nombre de workers (int) et une tranche de tâches. Cette fonction doit :- Créer des canaux tamponnés pour les tâches et les résultats (utiliser le nombre de tâches comme taille du tampon)
- Démarrer le nombre indiqué de workers sous forme de goroutines
- Envoyer toutes les tâches sur le canal de tâches, puis le fermer
- Utiliser une goroutine avec le WaitGroup pour fermer le canal de résultats lorsque tous les workers ont terminé
- Rassembler tous les résultats dans une tranche et la retourner
- Utiliser
main.go: lire les entrées et coordonner le pool de workers.Lisez le nombre de workers, puis le nombre de tâches. Pour chaque tâche, lisez son ID et sa valeur. Appelez
RunPoolavec les workers et les tâches, puis affichez chaque résultat au format :Task [TaskID]: [Computed]Affichez les résultats triés par TaskID dans l'ordre croissant.
Les entrées suivantes seront fournies :
- Ligne 1 : nombre de workers (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, avec :
2
4
1
3
2
5
3
2
4
7Votre sortie doit être :
Task 1: 9
Task 2: 25
Task 3: 4
Task 4: 49Les workers traitent les tâches simultanément (3 au carré vaut 9, 5 au carré vaut 25, etc.), et les résultats sont rassemblés et affichés dans l'ordre des ID des tâches. Avec 2 workers prenant en charge 4 tâches, le travail est réparti efficacement au sein du 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 et non exportésIntroduction à la POO en GoStructs comme classesDéfinir des méthodes sur des structsRécepteurs pointeurs ou par valeurInitialisation des structsFonctions constructeursRécapitulatif - Calculatrice simple4Interfaces
Introduction aux interfacesImplémentation impliciteL’interface comme contratInterface vide (any)Assertion de typeCommutation de typeComposition d’interfacesInterfaces Stringer et ErrorRécapitulatif - Calculateur de formes7Encapsulation
Champs exportés vs non exportésEncapsulation au niveau du packageMéthodes Getter et SetterDissimulation de l’information en GoRécapitulatif – Fiches d’étudiants10Génériques (Go 1.18+)
Introduction aux génériquesParamètres de typeContraintes de typeStructures génériquesSolution de contournement pour les méthodes génériquesRécapitulatif - Collection générique2Plongée approfondie dans les types et les structs
Types de base et compositesDéfinitions de types personnalisésTags de structStructs anonymesStructs imbriquésValeurs zéro et valeurs par défautRécapitulatif - Carnet de contacts5La composition plutôt que l’héritage
Pourquoi Go n’a pas d’héritageBases de l’inclusion de structsPromotion des méthodesInclure plusieurs structsInclusion ou agrégationMasquage des méthodes inclusesRécapitulatif : hiérarchie des employés8Gestion des erreurs et POO
L’interface errorTypes d’erreurs personnalisésEnrobage des erreurs (fmt.Errorf)Erreurs sentinelleserrors.Is() et errors.As()Panic, Defer et RecoverRécapitulatif - Analyseur de fichiers11Bibliothèque standard et POO
io.Reader et io.Writersort.InterfaceInterface fmt.Stringerencoding/json avec des structsInterface http.HandlerRécapitulatif - Modèles d’API REST14Modèles de conception – Partie 2
Modèle CommandeModèle AdaptateurModèle DécorateurModèle Méthode modèleModèle ÉtatModèle CompositeMiddleware comme décorateur3Pointeurs et mémoire
Notions de base des pointeurs en GoPointeurs vers des structuresPassage par valeur ou par référenceLa fonction new()Garbage collection en GoRécapitulatif - Constructeur de listes chaînées6Polymorphisme en Go
Polymorphisme via les interfacesDuck typing en GoRègles de satisfaction des interfacesCollections polymorphesInjection de dépendancesRécapitulatif – Processeur de paiements9Concurrence et POO
Bases des GoroutinesCanaux et communicationCanaux tamponnés ou non tamponnésInstruction selectsync.Mutex et sync.RWMutexsync.WaitGroupConception de structures thread-safeRécapitulatif - Pool de workersEntraînez-vous par vous-même : Compilateur Go en ligne