J'ai du mal à mettre sur pied un algorithme pour un fil de consommation de file d'attente asynchrone, qui est la lecture des éléments hors d'une seule file d'attente qui ont besoin d'être envoyé à faire un peu de temps en cours d'exécution (plusieurs secondes au moins) de travail.Consommant messages de file d'attente à la ressource de traitement variant selon le type de message
Fondamentalement, la file d'attente peut se présenter comme suit: A, A, A, A, A, B, B, A, B, A, A, A, A, A, C, B, A.
C'est à dire. les messages A sont beaucoup plus communs que les autres messages.
Notre système a différentes valeurs de simultanéité pour chacun des différents types de message, par ex. nous ne pouvons exécuter que 3 messages A à la fois, mais nous pouvons exécuter des messages 5 x B et 4 x C à la fois. Mon algorithme actuel (cassé) consiste à avoir un seul thread de lecture au début de la file d'attente et à envoyer chaque tâche à un pool de threads, le corps de chaque job attendant suffisamment de ressources pour être disponible avant d'exécuter la charge utile réelle.
Cela signifie que si suffisamment de messages arrivent A, puis ils peuvent « remplir » la file d'attente du pool de threads, et les messages B + C sont mort de faim beaucoup plus longtemps que nécessaire.
Jusqu'à présent, j'ai pensé d'avoir un pool de threads pour chaque type de message (nombre assez faible de types), mais je suis préoccupé par l'efficacité du maintien que de fils autour.
Avez-vous des suggestions pour améliorer cela?
* Il est préférable que les travaux dans une classe spécifique fonctionnent dans l'ordre. * La file d'attente est oui juste là pour persister les travaux à entreprendre. * Ils sont. * Pas toujours, la file d'attente peut être vide. Avez-vous des liens spécifiques pour l'emballage des poubelles qui s'appliquent? Je suis à peu près sûr d'avoir l'idée de ce problème et je ne vois pas comment cela se passe. Merci! –
À tout moment, vous avez un ensemble de tâches à exécuter et une quantité de ressources pour les exécuter. Chaque travail a un coût et vous souhaitez exécuter le meilleur ensemble de tâches possible pour maximiser la valeur des tâches en cours sans dépasser les ressources disponibles. Le problème du sac à dos montre comment sélectionner un ensemble de tâches afin de maximiser la valeur. – Jackson