2010-05-07 21 views
13

¿Existe un algoritmo conocido para implementar un grupo de conexiones? Si no, ¿cuáles son los algoritmos conocidos y cuáles son sus intercambios?
¿Qué patrones de diseño son comunes al diseñar y programar un grupo de conexiones?
¿Hay algún ejemplo de código que implemente un grupo de conexiones utilizando boost.asio?
¿Es una buena idea usar un grupo de conexiones para conexiones persistentes (no http)?
¿Cómo está relacionado el subproceso con la agrupación de conexiones? ¿Cuándo necesitas un hilo nuevo?¿Cómo programar un grupo de conexiones?

+0

Una pregunta a la vez es una buena práctica aquí. –

+0

Todos están relacionados, ¿preferiría que bombardeara stackflow con una pregunta para cada una de estas preguntas relacionadas? –

+0

Creo que el problema es que su pregunta hace que la gente piense que no ha investigado el tema y que quiere todas las respuestas (similar a las preguntas sobre 'tareas'). Aunque no es una forma inválida de preguntar, hace que, en mi opinión, no sea fácil para las personas participar. –

Respuesta

16

Si usted está buscando una política pura rosca-pooling (puede ser una conexión o cualquier otro recurso) hay dos enfoques simples a saber: -

  1. La mitad de sincronización/Media asíncrono modelo (generalmente utilizando utilizando mensajes colas para pasar información).

  2. Modelo de Líderes/Seguidores (por lo general, utiliza colas de solicitud para pasar información).

El primer enfoque es así: -

  • Se crea un grupo de subprocesos a manejar un recurso. A menudo, este tamaño (número de hilos) debe ser configurable. Llame a estos hilos 'Trabajadores'.
  • Luego crea un hilo maestro que enviará el trabajo a Trabajador hilos. El programa de aplicación distribuye la tarea como un mensaje al hilo maestro.
  • El hilo principal pone el mismo en el mensaje Q de un hilo elegido Trabajador y el trabajador hilo remueve a sí mismo desde la piscina . Elegir y eliminar el Trabajador thread necesita sincronización.
  • Después de que Trabajador completa la tarea , vuelve al grupo de subprocesos.

El propio hilo principal puede consumir las tareas que obtiene en de orden de llegada o una prioridad manera. Esto dependerá de tu implementación.

El segundo modelo (líder/Seguidores) es algo como esto: -

  • Crear un grupo de subprocesos. Inicialmente, todos son Trabajadores. A continuación, elija un Líder, descanse automáticamente; todos se convierten en seguidores. Tenga en cuenta que la elección de a Leader tiene que estar sincronizada.
  • Poner todos los datos para ser procesados ​​en un solo pedido Q.
  • El grupo de threads Leader dequeues tarea. A continuación, inmediatamente elige nuevo Leader y comienza a ejecutar la tarea.
  • El nuevo Leader retoma la siguiente tarea .

También puede haber otros enfoques, pero los descritos anteriormente son simples y funcionan con la mayoría de los casos de uso.

La mitad de sincronización/Media asíncrono mayor debilidad: -

  • Superior cambio de contexto, sincronización y copiar datos por encima.

Líder/Follwers mayor debilidad: -

  • Implementación complejidad de Líder elección en la agrupación de hebras.

Ahora puede decidir por sí mismo el enfoque más correcto. HTH,

+0

Esto es realmente útil. Te agradezco mucho. El segundo enfoque parece interesante, pero ¿cómo se seleccionaría un líder? ¿Sería el objeto de hilo lo que está disponible? ¿Qué pasa si no hay hilos disponibles en el grupo? ¿Debería el líder actual ejecutar la tarea y esperar que otro hilo esté disponible o debería mantener su papel de líder? ¿El conjunto de conexiones es básicamente una colección de hilos? ¿Debería ser un vector? ¿Una lista? ¿Un conjunto? En este enfoque, ¿cómo conseguiría las tareas necesarias (Enviado por los clientes)? ¿Es el líder responsable de eso? –

+2

Después de recibir el nombre de esos patrones comunes busqué en Google y encontré esto: http://www.kircher-schwanninger.de/michael/publications/lf.pdf Lo leeré y se ve interesante. –

+2

@the_drow: Leader es solo otro hilo pero que tiene que tomar la tarea. Siempre debe haber un líder, si todos los hilos del grupo están ocupados, entonces la tarea debe esperar en la solicitud Q para que el nuevo líder sea elegido. Una vez que haya un líder, se encargará de la tarea. De nuevo, esta solicitud Q puede estar basada en FCFS o en prioridad. El enlace que encontraste es de hecho decente, puedes considerar los enfoques que se dan allí. – Abhay

Cuestiones relacionadas