ZMQ Pair
PAIR is the simplest ZeroMQ pattern — a raw bidirectional pipe.
| import zmq
import time
import msgpack
import multiprocessing as mp
ENDPOINT = "ipc:///tmp/pair.ipc"
def publisher():
ctx = zmq.Context()
sock = ctx.socket(zmq.PAIR)
sock.bind(ENDPOINT)
print("Server: waiting for message...")
data = sock.recv()
msg = msgpack.unpackb(data, raw=False)
print("Server received:", msg)
reply = {
"status": "ok",
"received_id": msg["id"],
}
sock.send(msgpack.packb(reply))
print("Server: reply sent")
sock.close()
ctx.term()
def subscriber():
ctx = zmq.Context()
sock = ctx.socket(zmq.PAIR)
sock.connect(ENDPOINT)
msg = {
"id": 1,
"name": "camera",
"value": 3.14,
"active": True,
}
sock.send(msgpack.packb(msg))
print("Client: message sent")
reply = sock.recv()
reply_msg = msgpack.unpackb(reply, raw=False)
print("Client received:", reply_msg)
sock.close()
ctx.term()
if __name__ == "__main__":
mp.set_start_method("spawn", force=True) # safe default
p_sub = mp.Process(target=subscriber)
p_pub = mp.Process(target=publisher)
p_sub.start()
time.sleep(0.1) # ensure SUB starts first
p_pub.start()
p_pub.join()
p_sub.join()
|