Introduction aux files d'attente de tâches en TypeScript
\n\nUne file d'attente de tâches (task queue) est l'une des structures de données fondamentales en programmation, qui fonctionne selon le principe "premier arrivé, premier servi" (FIFO). En TypeScript, les files d'attente de tâches sont largement utilisées pour gérer les opérations asynchrones, traiter les requêtes, organiser les processus en arrière-plan et bien d'autres scénarios.
\n\nDans cet article, nous allons voir comment créer et utiliser des files d'attente de tâches en TypeScript à partir de zéro. Vous apprendrez à implémenter une file d'attente de base, à ajouter des priorités et à gérer les erreurs. Ce contenu est destiné aux développeurs débutants familiers avec les bases de TypeScript.
\n\nQu'est-ce qu'une file d'attente de tâches et pourquoi en a-t-on besoin ?
\n\nUne file d'attente est une liste ordonnée d'éléments où l'ajout de nouveaux éléments se fait à la fin et l'extraction au début. Imaginez une file d'attente dans un magasin : le premier client est servi en premier, et les nouveaux clients se mettent à la fin.
\n\nEn programmation, les files d'attente de tâches sont utilisées pour :
\n\n- \n
- Traitement asynchrone — exécution de tâches en arrière-plan sans bloquer le thread principal \n
- Gestion de la charge — limitation du nombre d'opérations simultanées \n
- Traitement des événements — traitement séquentiel des requêtes entrantes \n
- Planification des tâches — exécution de tâches avec un délai ou selon un calendrier \n
Implémentation d'une file d'attente de tâches de base en TypeScript
\n\nCréation de la classe de file d'attente
\n\nCommençons par une implémentation simple d'une file d'attente en TypeScript. Créons une classe TaskQueue qui prend en charge les opérations de base :
// task-queue.ts\ntype Task<T> = () => Promise<T>;\n\nclass TaskQueue<T> {\n private queue: Task<T>[] = [];\n private isProcessing = false;\n\n // Ajout d'une tâche à la file d'attente\n enqueue(task: Task<T>): void {\n this.queue.push(task);\n if (!this.isProcessing) {\n this.processQueue();\n }\n }\n\n // Traitement de la file d'attente\n private async processQueue(): Promise<void> {\n this.isProcessing = true;\n\n while (this.queue.length > 0) {\n const task = this.queue.shift()!;\n try {\n const result = await task();\n console.log('Tâche terminée :', result);\n } catch (error) {\n console.error('Erreur lors de l\\'exécution de la tâche :', error);\n }\n }\n\n this.isProcessing = false;\n }\n\n // Vérification si la file d'attente est vide\n isEmpty(): boolean {\n return this.queue.length === 0;\n }\n\n // Obtention de la taille de la file d'attente\n size(): number {\n return this.queue.length;\n }\n}\n\nUtilisation de la file d'attente
\n\nVoyons maintenant comment utiliser notre classe en pratique :
\n\n// example.ts\nconst taskQueue = new TaskQueue<string>();\n\n// Création de plusieurs tâches asynchrones\nconst task1 = async () => {\n await delay(1000);\n return 'Première tâche terminée';\n};\n\nconst task2 = async () => {\n await delay(500);\n return 'Deuxième tâche terminée';\n};\n\nconst task3 = async () => {\n await delay(200);\n return 'Troisième tâche terminée';\n};\n\n// Ajout des tâches à la file d'attente\ntaskQueue.enqueue(task1);\ntaskQueue.enqueue(task2);\ntaskQueue.enqueue(task3);\n\n// Fonction utilitaire\nfunction delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n// Résultat :\n// Tâche terminée : Première tâche terminée (après 1s)\n// Tâche terminée : Deuxième tâche terminée (après 1.5s)\n// Tâche terminée : Troisième tâche terminée (après 1.7s)\n\nFile d'attente avancée avec priorités
\n\nDans les projets réels, il est souvent nécessaire de traiter des tâches avec différentes priorités. Étendons notre file d'attente en ajoutant la prise en charge des priorités :
\n\n// priorit