zmq socket context python ipc zeromq inproc

python - socket - ¿Cómo utilizar los transportes inproc e ipc de Zeromq?



zmq rep (4)

Según mi conocimiento, 0MQ no admite UDP. Además, IPC solo es compatible con sistemas operativos que tienen una implementación compatible con POSIX de canalizaciones con nombre; Por lo tanto, en Windows, solo puede usar ''inproc'', TCP o PGM. Sin embargo, más allá de todo esto, una de las características principales de 0MQ es que su protocolo es solo parte de la dirección. Puede tomar cualquier ejemplo, cambiar la dirección del socket, y todo debería funcionar bien (sujeto, por supuesto, a las restricciones mencionadas anteriormente). Además, el ZGuide tiene muchos ejemplos (muchos de los cuales están disponibles en Python ).

Soy un novato en ZERMQ. ZeroMQ tiene transportes TCP, INPROC e IPC. Estoy buscando ejemplos usando python e inproc en Winx64 y python 2.7, que también se podrían usar para Linux.

Además, he estado buscando métodos de transporte UDP y no puedo encontrar ejemplos.

El único ejemplo que encontré es

import zmq import zhelpers context = zmq.Context() sink = context.socket(zmq.ROUTER) sink.bind("inproc://example") # First allow 0MQ to set the identity anonymous = context.socket(zmq.XREQ) anonymous.connect("inproc://example") anonymous.send("XREP uses a generated UUID") zhelpers.dump(sink) # Then set the identity ourself identified = context.socket(zmq.XREQ) identified.setsockopt(zmq.IDENTITY, "Hello") identified.connect("inproc://example") identified.send("XREP socket uses REQ''s socket identity") zhelpers.dump(sink)

El caso de uso en el que estoy pensando es: UDP como distribución de información. La prueba de Push / Pull usando TCP es más rápida o sería más rápida en proceso.

Aquí está el ejemplo de prueba> ..............

Servidor:

import zmq import time context = zmq.Context() socket = context.socket(zmq.REP) socket.bind("inproc://example2") while True: # Wait for next request from client message = socket.recv() print "Received request: ", message # Do some ''work'' time.sleep (1) # Do some ''work'' # Send reply back to client socket.send("World")

Cliente:

import zmq context = zmq.Context() # Socket to talk to server print "Connecting to hello world server..." socket = context.socket(zmq.REQ) socket.connect ("inproc://example2") # Do 10 requests, waiting each time for a response for request in range (1,10): print "Sending request ", request,"..." socket.send ("Hello") # Get the reply. message = socket.recv() print "Received reply ", request, "[", message, "]"

Mensaje de error:

socket.connect ("inproc://example2") File "socket.pyx", line 547, in zmq.core.socket.Socket.connect (zmq/core/socket.c:5347) zmq.core.error.ZMQError: Connection refused


Si ( y solo si ) usa los zócalos ZMQ_PUB o ZMQ_SUB, lo que no hace en los ejemplos que dio, donde usa ROUTER, XREQ, etc., puede usar UDP, o más precisamente, la multidifusión UDP a través

"epgm: // host: port"

EPGM significa Encapsulated PGM , es decir, PGM encapsulado en UDP, que es más compatible con la infraestructura de red existente que PGM sin formato.

Véase también http://api.zeromq.org/2-1:zmq-pgm

Sin embargo, no conozco ningún soporte UDP para escenarios de unidifusión.


Tuve el mismo problema cuando la versión de mi pyzmq y zmq es la versión anterior, actualizo la versión a 15.2.0, luego resolví el problema, el prefijo de la dirección ipc que usé es "inproc: //"

os: win7-x64 python: 2.7.6


ZeroMQ tiene soporte UDP seguro para subprocesos a partir de marzo de 2016:

  • Tienes que usar el patrón Radio / Dish (muy similar a Pub / Sub)
  • Compatible con libzmq y czmq
  • Ver tests/test_udp.cpp , tests/test_radio_dish.cpp en el código fuente de libzmq
  • Desglose completo provisto por Doron Somech en el subproceso zeromq-dev @ list: Thread safe Pub / Sub y Multicast