2011-03-19 13 views
5

Parece que todos los ejemplos siempre muestran ejecutando el mismo io_service en todos los hilos.boost :: asio iniciando diferentes servicios en hilos?

¿Puedes iniciar varios io_servicios? Esto es lo que me gustaría hacer:

inicio io_service A en el hilo principal para el manejo de la entrada del usuario ...

iniciar otro io_service B en otro hilo que luego puede iniciar un grupo de trabajadores hilos de intercambio de todo io_service B.

Los usuarios de io_service A pueden "publicar" el trabajo en io_service B para que se realice en el grupo de trabajadores pero no se debe hacer ningún trabajo en io_service A, es decir, el hilo principal.

¿Esto es posible? ¿Esto tiene sentido?

Gracias

Respuesta

1

¡Buena pregunta!

Sí, es posible para uno. En una aplicación en la que estoy trabajando actualmente he dividido la aplicación en componentes separados responsables de diferentes aspectos del sistema. Cada componente se ejecuta en su propio hilo, tiene su propio conjunto de temporizadores, realiza su propia red de E/S utilizando asio. Desde la perspectiva de la capacidad de prueba/diseño, me parece más limpio, ya que ningún componente puede interferir con otro, pero puedo corregirlo. Supongo que podría reescribir todo lo que pasa en el servicio io como parámetro, pero actualmente no he encontrado la necesidad de hacerlo.

Volviendo a su pregunta, puede hacer lo que desee, IMO es más una cuestión de probarlo y cambiarlo si se encuentra con algún problema.

Además, es posible que desee echar un vistazo a lo que Sam Miller señaló en una entrada del usuario la manipulación posterior WRT diferente (es decir, si usted está utilizando una consola): https://stackoverflow.com/questions/5210796/boost-asio-how-to-write-console-server

+0

+1 para vincular a mi respuesta que muestra el uso de posix :: stream_descriptor. –

2

En mi experiencia, lo que realmente depende de la aplicación si un io_service por CPU o uno por proceso tiene un mejor rendimiento. Hubo una discusión en la lista de correo asio-users hace unos años sobre este mismo tema.

La documentación de Boost.Asio tiene excelentes ejemplos de las técnicas showing these two en los ejemplos HTTP Server 2 y HTTP Server 3. Pero tenga en cuenta que el segundo servidor HTTP solo muestra cómo usar esta técnica, no cuándo ni por qué usarla. Esas preguntas deberán responderse mediante el perfil de su aplicación.

En general, se debe utilizar la siguiente orden al crear aplicaciones que utilizan Boost.Asio

  1. Individual roscada
  2. conjunto de subprocesos con una sola io_service
  3. múltiple io_service objetos con algún tipo de afinidad de CPU
+0

+1 discusión interesante :), me hace preguntarme sobre el diseño de mi sistema, aunque todavía no he tenido ningún problema. – Ralf

+0

Aquí está la situación, tengo una aplicación que tiene un hilo y un io_servicio que maneja sockets y stdio, es un viejo código para guardar sin hilos.Ahora me gustaría agregar un grupo de subprocesos de trabajo que tenga su propio io_service y no interactúe con el código que no sea seguro para subprocesos en el subproceso principal. El pool de trabajadores ejecutará un código separado en datos separados y la comunicación se realizará a través de las publicaciones de io_service entre el io_service principal y el io_service ejecutados en el grupo de subprocesos. Suena como que esto se puede hacer? –

+0

@Oliver sí, parece que se puede hacer. Sin embargo, si fuera mi tarea, arreglaría el código que no es seguro para subprocesos con hebras y usaría un único io_servicio con un conjunto de subprocesos invocando a io_service :: run(). –