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