broker.py
import zmq
import gevent
def get_broker(xsub_port, xpub_port):
context = zmq.Context()
xsub_socket = context.socket(zmq.XSUB)
xsub_addr = 'tcp://*:%s' % xsub_port
xsub_socket.bind(xsub_addr)
# make xsub receive any message
xsub_socket.send(b'\x01')
xpub_addr = 'tcp://*:%s' % xpub_port
xpub_socket = context.socket(zmq.XPUB)
xpub_socket.bind(xpub_addr)
# make xpub receive verbose messages
xpub_socket.setsockopt(zmq.XPUB_VERBOSE, 1)
zmq.proxy(xsub_socket, xpub_socket)
gevent.spawn(get_broker(5555, 5556)).join()
pub.py
import zmq
import random
import time
from multiprocessing import Process
a = ['one', 'two', 'three', 'four', 'five']
b = [10, 20, 30, 31, 50]
d = dict(zip(a, b))
def pub001():
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.connect("tcp://127.0.0.1:5555")
while True:
for i, x in d.items():
topic = x
number = random.randrange(1, 215)
print(topic, number)
# socket.send_string("%d %d" % (topic, number))
socket.send_multipart([str(topic).encode(), str(number).encode()])
print("Data published", topic)
time.sleep(1)
if __name__ == "__main__":
a = Process(target=pub001, args=())
a.start()
在下面的绑定中,
socket.setsockopt_string(zmq.SUBSCRIBE, '30')
socket.setsockopt(zmq.SUBSCRIBE, b'30')
貌似有一样的结果。
sub.py
#!/usr/bin/python
# -*-coding:utf-8-*-
import zmq
import time
context = zmq.Context()
socket = context.socket(zmq.SUB)
# socket.setsockopt_string(zmq.SUBSCRIBE, '')
# socket.setsockopt_string(zmq.SUBSCRIBE, '2')
socket.setsockopt_string(zmq.SUBSCRIBE, '30')
socket.connect("tcp://127.0.0.1:5556")
socket.setsockopt_string(zmq.UNSUBSCRIBE, '3')
socket.setsockopt(zmq.SUBSCRIBE, b'30')
idx = 0
while True:
msg = socket.recv_multipart()
print(idx, '==', type(msg), msg)
idx += 1