2009-06-16 9 views
0

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?

Répondre

4

Pourquoi ne pas avoir votre unique répartiteur, expédier pour séparer les files d'attente qui sont ensuite basées sur le type de message. Donc, vous auriez 4 répartiteurs au total, le premier envoie un message à trois autres files d'attente.

Ensuite, vous avez des lecteurs de file d'attente séparés qui retirent les messages de la file d'attente en fonction de leurs propres règles.

0

Je ne suis pas sûr qu'avoir un threadpool séparé pour chaque type de message est si mauvais. Vous devrez simplement le faire et voir ce qui se passe.

Quant aux alternatives, vous pouvez créer une enveloppe autour threadpool et mettre en œuvre une file d'attente prioritaire (http://en.wikipedia.org/wiki/Priority_queue). Cette implicite va attribuer la priorité à certains messages. Dans votre cas, puisque C est le moins commun, il peut toujours donner la priorité à C plus haut. Je pense que vous comprenez l'idée.

0

Tout d'abord, les hypothèses suivantes sont-elles valides?

  • Peu importe quel ordre les emplois exécutent réellement.
  • La file d'attente est juste un mécanisme d'enregistrement des travaux à entreprendre.
  • Les travaux sont tous indépendants.
  • Il existe toujours plusieurs tâches en attente de traitement.

Si tel est le cas, je pense que c'est un exemple d'un problème de planification d'atelier. Je pense que ceux-ci sont généralement modélisés en utilisant un algorithme d'emballage bin - une recherche google sur les sujets ci-dessus devrait trouver beaucoup de références.

Il se pourrait bien que parce que vos contraintes sont si simples un algorithme d'emballage est plus approprié havresac que l'emballage bin, il suffit de faire un google pour le problème de havresac.

+0

* 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! –

+0

À 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

Questions connexes