読者です 読者をやめる 読者になる 読者になる

zmqで PUB/SUB してみる

PUSH/PULL はあまり面白く無さそうなので、PUB/SUB を試してみました。

PUB

PUB 側が bind します。 SUB は定期的に PUB に接続を見に行くので、少し寝てあげる必要があったりします。

import time

import zmq

ctx = zmq.Context()
sock = ctx.socket(zmq.PUB)

sock.bind('tcp://127.0.0.1:5555')

time.sleep(1.0)

sock.send('hello')

SUB

SUB が PUB に繋ぎに行きます。今回はルートは空なので FANOUT で、全員に配ります。

普通の MQ でもこれは出来ますね。

import zmq
from zmq.eventloop import ioloop

loop = ioloop.IOLoop.instance()

ctx = zmq.Context()
sock = ctx.socket(zmq.SUB)
sock.connect('tcp://127.0.0.1:5555')

sock.setsockopt(zmq.SUBSCRIBE, '')

def sub_handler(sock, events):
  msg = sock.recv()
  print msg

loop.add_handler(sock, sub_handler, zmq.POLLIN)

loop.start()

動かしてみる

sub 1 つめ

$ python sub.py

sub 2 つめ

$ python sub.py

$ python pub.py

とやって、両方の sub に hello が表示されたら無事配信されています。

Erlang/Python をつなげてみようと思います。まずは REQ/REP での実装を試してみようと思います。