3

我正在调试一些 zeromq 代码,我想记录套接字实例发送/接收。换句话说,我有

context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect("tcp://127.0.0.1:5000")

我想以某种方式在代码的其他地方记录套接字实例的发送/接收。

这里有什么想法吗?我不知道从哪里开始。

4

1 回答 1

3

这是记录每条消息的 Socket 对象的示例:

导入日志
进口时间
导入zmq

类 LogSocket(对象):
    插座 = 无
    日志 = 无
    名称 = 无

    def __init__(self, socket, log=None, name=None):
        """包装一个套接字,以便发送/recv_multipart 记录他们的消息"""
        self.socket = 套接字
        如果日志为无:
            logging.basicConfig(level=logging.INFO)
            日志 = logging.getLogger().info
        self.log = 日志

        如果名称为无:
            name = s.identity 或 repr(s)
        self.name = 名称

    def send_multipart(self, msg, *args, **kwargs):
        self.log("%s 发送: %r" % (self.name, msg))
        返回 self.socket.send_multipart(msg, *args, **kwargs)

    def recv_multipart(self, *args, **kwargs):
        msg = self.socket.recv_multipart(*args, **kwargs)
        self.log("%s 收到: %r" % (self.name, msg))
        返回消息

    def __getattr__(self, key):
        返回 getattr(self.socket, key)


ctx = zmq.Context.instance()

s = ctx.socket(zmq.REQ)
s.connect("tcp://127.0.0.1:5556")

# 在 Logging 对象中包装 zmq 套接字:
# 这个对象的接口与
s = LogSocket(s, name="REQ")

对于范围内的 i (5):
    时间.sleep(1)
    s.send_multipart(['hello', 'world'])
    回复 = s.recv_multipart()
    # 在这种情况下,只记录 _multipart 方法,因此不直接发送/接收:
    s.send("安静")
    s.recv()

用于处理序列化/日志记录/身份验证等的辅助对象的一个​​示例是 IPython 中的Session 对象,它比这个简单的情况复杂得多,但允许您将所有消息传递抽象集中在你的代码。

于 2012-05-03T23:49:46.103 回答