def topic(self, env): sub = env['ctx'].socket(zmq.SUB) sub.setsockopt(zmq.SUBSCRIBE, '') sub.connect('inproc://vows/pubsub') stream = ZMQStream(sub, self.io_loop) def cb(data): self.stop(data) stream.on_recv(cb) env['pub'].send_multipart(["", "This is expected!"]) return self.wait()
def __init__(self, context=None, io_loop=None): """ Initialize the sockets and streams. The `socket_definitions`, `sockets` and `streams` variables are being created in the subclass by the decorator. """ self.context = context or ZmqContext.instance() self.io_loop = io_loop or IOLoop.instance() for sockname in self.socket_definitions: sockdef = self.socket_definitions[sockname] if not (isinstance(sockdef, Bind) or isinstance(sockdef, Connect)): raise TypeError # create the socket sock = self.context.socket(sockdef.socktype) # set the socket options for oname, ovalue in sockdef.opts: sock.setsockopt(oname, ovalue) # connect or bind if isinstance(sockdef, Bind): sock.bind(sockdef.sockspec) elif isinstance(sockdef, Connect): sock.connect(sockdef.sockspec) # create the ZMQStream stream = ZMQStream(sock, self.io_loop) # setup callbacks if sockdef.on_recv_name: stream.on_recv(getattr(self, sockdef.on_recv_name)) if sockdef.on_send_name: stream.on_send(getattr(self, sockdef.on_send_name)) if sockdef.on_err_name: stream.on_err(getattr(self, sockdef.on_err_name)) self.sockets[sockname] = sock self.streams[sockname] = stream