2010-05-07 5 views
13

Existe-t-il un algorithme connu pour implémenter un pool de connexions? Sinon, quels sont les algorithmes connus et quels sont leurs compromis?
Quels modèles de conception sont courants lors de la conception et de la programmation d'un pool de connexions?
Existe-t-il des exemples de code implémenter un pool de connexion en utilisant boost.asio?
Est-ce une bonne idée d'utiliser un pool de connexions pour les connexions persistantes (pas http)?
Comment le thread est-il lié au pool de connexions? Quand avez-vous besoin d'un nouveau sujet?Comment programmer un pool de connexions?

+0

Une question à la fois est une bonne pratique ici. –

+0

Ils sont tous liés, préférez-vous que je bombarder stackoverflow avec une question pour chacune de ces questions connexes? –

+0

Je pense que le problème est que votre question fait croire aux gens que vous n'avez fait aucune recherche sur le sujet et que vous voulez toutes les réponses (similaires aux questions de «devoirs»). Bien que ce ne soit pas une façon de poser des questions, cela rend, à mon avis, difficile la participation des gens. –

Répondre

16

Si vous êtes à la recherche d'une politique pure fil de mise en commun (peut être une connexion ou une ressource), il existe deux approches simples à savoir: -

  1. Half Sync/Half Async modèle (en utilisant généralement en utilisant le message files d'attente pour transmettre des informations). Modèle Leaders/Followers (généralement en utilisant des files d'attente de requêtes pour transmettre des informations).

La première approche va comme ceci: -

  • Vous créez un pool de threads à gérer une ressource. Souvent cette taille (nombre de threads) doit être configurable. Appelez ces fils 'Travailleurs'.
  • Vous créez ensuite un thread principal que enverra le travail aux threads Worker. Le programme d'application envoie la tâche comme un message au fil maître.
  • Le fil maître met le même sur le message Q d'un travailleur choisi fil et le fil travailleur se retire de la piscine . Choisir et supprimer le Worker thread doit être synchronisé.
  • Après que le Worker a terminé la tâche , il retourne au pool de threads.

Le fil maître lui-même peut consommer les tâches qu'il reçoit dans PAPS ou d'une manière priorité. Cela dépendra de votre implémentation.

Le deuxième modèle (leader/Suiveurs) va quelque chose comme ceci: -

  • Créer un pool de threads. Initialement tous sont Travailleurs. Choisissez ensuite un Leader, automatiquement repos-tous deviennent des suiveurs. Notez que l'élection a Leader doit être synchronisée.
  • Mettez toutes les données à traiter sur un simple demande Q.
  • Le pool de threads Leader dequeues la tâche . Il immédiatement alors élit un nouveau chef et commence à exécuter la tâche. Le nouveau Leader sélectionne la tâche suivante.

Il peut y avoir d'autres approches, mais celles décrites ci-dessus sont simples et fonctionnent avec la plupart des cas d'utilisation.

Demi-Sync/Async Demi faiblesse majeure: -

  • changement de contexte plus élevé, la synchronisation , et la copie de données dessus.

chef/Follwers faiblesse majeure: -

  • La mise en œuvre complexité de chef élection dans la piscine de fil.

Maintenant, vous pouvez décider vous-même le plus correcte approche. HTH,

+0

Ceci est vraiment utile. Je vous remercie beaucoup. La deuxième approche semble intéressante mais comment choisir un leader? Serait-ce l'objet thread disponible? Que faire s'il n'y a pas de fils disponibles dans la piscine? Le leader actuel devrait-il exécuter la tâche et attendre qu'un autre thread devienne disponible ou devrait-il conserver son rôle de leader? Le pool de connexions est-il essentiellement une collection de threads? Est-ce que ce devrait être un vecteur? Une liste? Un ensemble? Dans cette approche, comment devrais-je obtenir les tâches à effectuer (envoyées par les clients)? Le chef est-il responsable de cela? –

+2

Après avoir reçu le nom de ces modèles communs, j'ai recherché sur google: http://www.kircher-schwanninger.de/michael/publications/lf.pdf Je vais le lire et il semble intéressant. –

+2

@the_drow: Leader est juste un autre thread, mais qui doit prendre la tâche. Il doit toujours y avoir un leader, si tous les threads du pool sont occupés, alors la tâche doit attendre dans la requête Q pour que le nouveau leader soit élu. Une fois qu'il y aura un chef, il s'occupera de la tâche. Là encore, cette requête Q peut être basée sur FCFS ou sur une priorité. Le lien que vous avez trouvé est en effet un bon, vous pouvez considérer les approches qui y sont données. – Abhay

Questions connexes