Files d'attente de tâches pour Kotlin : Coroutines et KJobQueue

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Files d'attente de tâches pour Kotlin : Coroutines et KJobQueue

Dans le développement moderne avec Kotlin — que ce soit pour une application Android, un backend avec Ktor ou un microservice — il est souvent nécessaire d'exécuter des tâches en arrière-plan de manière asynchrone et dans le bon ordre. Une file d'attente de tâches (job queue) permet de gérer ces opérations : téléchargement de fichiers, synchronisation de données, envoi d'analyses, traitement d'images. Dans cet article, nous allons voir comment construire une file d'attente de tâches avec les coroutines Kotlin, et découvrir la bibliothèque KJobQueue, une solution légère pour la gestion avancée des tâches.



Pourquoi une file d'attente de tâches ?

Les principaux problèmes résolus par une file d'attente de tâches :

  • Ordre d'exécution — les tâches ne doivent pas entrer en conflit pour les ressources.
  • Limitation du parallélisme — par exemple, pas plus de 3 téléchargements simultanés.
  • Gestion des erreurs et tentatives — en cas d'échec, une tâche peut être relancée.
  • Priorités — les tâches urgentes sont exécutées en premier.
  • Résistance au redémarrage — la file peut conserver son état.


File d'attente simple avec les coroutines (Channel)

La façon la plus simple d'implémenter une file d'attente est d'utiliser Channel et une coroutine de traitement. Exemple :



import kotlinx.coroutines.*import kotlinx.coroutines.channels.Channel

data class Task(val id: Int, val payload: String)

suspend fun processTask(task: Task) { println("Traitement de la tâche ${task.id} : ${task.payload}") delay(500) // simulation de travail}

fun main() = runBlocking { val taskChannel = Channel<Task>(capacity = 10)

// Lancement du worker val worker = launch { for (task in taskChannel) { processTask(task) } }

// Ajout de tâches launch { repeat(5) { i -> taskChannel.send(Task(i, "Données $i")) } taskChannel.close() }

worker.join()}


Cette approche convient pour des scénarios simples, mais ne prend pas en charge les priorités, les tentatives et la persistance de l'état.



KJobQueue — une bibliothèque pour une file d'attente avancée

KJobQueue (disponible sur GitHub) est une bibliothèque légère pour Kotlin, construite sur les coroutines. Elle offre :

  • File d'attente avec priorités (basée sur Comparable).
  • Limitation du parallélisme (nombre de tâches exécutées simultanément).
  • Tentatives automatiques avec délai.
  • Prise en charge de l'annulation et de l'arrêt.
  • Dispatcher configurable (pool de threads).


Installation

Ajoutez dans build.gradle.kts :

dependencies {    implementation("io.github.kjobqueue:kjobqueue-core:1.0.0")}


Exemple d'utilisation de KJobQueue

import io.github.kjobqueue.*import kotlinx.coroutines.*import kotlin.random.Random

class DownloadJob(val url: String, override val priority: Int = 0) : PriorityJob { override suspend fun execute() { println("Téléchargement de $url (priorité $priority)") delay(1000) if (Random.nextBoolean()) throw RuntimeException("Erreur réseau") }}

fun main() = runBlocking { val queue = JobQueue( maxConcurrent = 2, // maximum 2 tâches simultanées retryDelayMs = 500L, // délai avant une nouvelle tentative maxRetries = 3 // maximum 3 tentatives )

queue.add(DownloadJob("https://example.com/file1", priority = 5)) queue.add(DownloadJob("https://example.com/file2", priority = 1)) queue.add(DownloadJob("https://example.com/file3", priority = 10))

delay(5000) // laisser le temps d'exécution queue.shutdown()}


Gestion des erreurs et tentatives

KJobQueue gère automatiquement les exceptions. Si une tâche lève une exception, elle

Recommendations