如何使用ZMQ套接字的子类

时间:2014-09-12 09:19:55

标签: pyzmq

我想继承zmq.Socket类,以便在发送Python对象和反序列化收到的消息之前自动序列化它们。现在是zmq.Socket的docstring,为了创建一个套接字,我应该创建一个 context ,然后调用

socket = context.socket(socket_type)

使用这个方案,我如何使用自己的zmq.Socket子类?

2 个答案:

答案 0 :(得分:0)

您是否了解套接字中的send_pyobjrecv_pyobj方法?他们用pickle串行化Python对象。

这会解决您的问题吗?否则,如果您可以指定您的问题,那就太棒了。

答案 1 :(得分:0)

zmq.Context类上有一个(很少有文档证明)_socket_class属性,可用于自定义socket(socktype)方法的结果。例如,要添加CBOR序列化方法:

import cbor
import zmq

class CBORSocket(zmq.Socket):
    def send_cbor(self, obj, flags=0):
        return self.send(cbor.dumps(obj), flags=flags)

    def recv_cbor(self, flags=0):
        return cbor.loads(self.recv(flags=flags))

class CBORContext(zmq.Context):
    _socket_class = CBORSocket

def main():
    ctx = CBORContext()
    rep = ctx.socket(zmq.REP)
    req = ctx.socket(zmq.REQ)
    rep.bind('inproc://foo')
    req.connect('inproc://foo')
    req.send_cbor('Hello world!')
    print(rep.recv_cbor())

main()

尽管缺少_socket_class的文档,但它确实出现在pyzmq example scripts之一中,尽管documentation itself中似乎没有使用它们。不过,我还是希望这是官方的/不太可能会随意消失!