2012-06-26 10 views
6

En C tenemos Sockets y descriptores, es posible simplemente tomar uno de estos y entregarlos a un Thread, esto hace posible que pueda aceptar conexiones entrantes y dar el trabaje con un hilo que le guste y el hilo puede enviar por sí mismo la respuesta.ZeroMQ: cómo lograr un multihilo C-like

Mi pregunta es, ¿cómo puedo lograr esto con ZeroMQ? Con el patrón Solicitud-Respuesta parece que no puedo enviar y recibir de manera asíncrona, las respuestas deben ser en secuencia, mi objetivo sería tener múltiples clientes en un único servidor, enviando respuestas no en secuencia.

Eché un vistazo al patrón Solicitud de respuesta, pero la API establece claramente que el uso de ese socket con múltiples subprocesos es una mala idea. Tal vez me he perdido algo o ZeroMQ es más inteligente de lo que sé. Si necesita más información solo publique un comentario y haré todo lo posible para brindar la información.

también tuve un vistazo a los ejemplos proporcionados: Code Examples

Aquí está la descripción del zócalo: ZMQ-Socket

Respuesta

3

Después de días de búsqueda, una persona amiga de IRC en el canal zeromq me brindó su ayuda.

Un enlace actualizado en caso de que alguien todavía esté buscando eso. Debe ser persistente! http://zguide.zeromq.org/

Este ejemplo realmente funciona bien, es fácil de adaptar, he usado boost threads con un threadpool.

+0

Lamentablemente, esa página no existe. ¿Te importa publicarlo aquí así que esta es una respuesta? –

+0

Hola d -_- b aquí hay otra opción para él con waybackmachine http://web.archive.org/web/20120704201150/http://www.zeromq.org/blog:multithreaded-server –

+0

Agradable lectura. Gracias Oliver –

2

Según entiendo Es necesario un servidor que quieren hacer nuevo hilo para cada conexión entrante y cada hilo responda exactamente a una conexión, si es así, código de ejemplo que hace exactamente esto: http://www.kieser.net/linux/java_server.html

+0

Gracias Shahryar por su esfuerzo, mi solicitud aquí es realmente con "zeroMq" la razón es escalabilidad, me gustaría poder extender la aplicación más tarde para tener trabajadores en diferentes máquinas para hacer las tareas, con zeromq puedo "según el modelo" expandir mi modelo con la biblioteca a tienen un patrón diferente y, por lo tanto, tienen una mayor capacidad de escalado. –

2

A menudo, cuando intenta adaptar diseños existentes a 0MQ, se mete en problemas. Aquí el diseño existente pasa los sockets (generalmente, HTTP) a los procesos o hilos secundarios, y luego les permite responder. No es un diseño muy elegante. Funciona porque cada nueva conexión existe como un socket, y porque cuando se envía una respuesta, el socket se destruye. Ninguno de estos se aplica a las aplicaciones de 0MQ.

El diseño de 0MQ usa un socket frontend ROUTER que atrae las solicitudes de los clientes. A continuación, transfiere estas solicitudes a los subprocesos de trabajo en los sockets inproc: //, utilizando un CONCESIONARIO de backend para gestionar las solicitudes. Los subprocesos de trabajo utilizan un socket REP para recibir las solicitudes y volver a enviar sus respuestas. El hilo principal sondea tanto en el frontend como en el backend, simplemente enrutando los mensajes entre los dos.

¿Qué es lo que el artículo antiguo blog explica (usando los nombres legado XREP/XREQ), y se explica con más detalle con ejemplos en muchos idiomas aquí: http://zguide.zeromq.org/page:all#Multithreading-with-MQ