下面是記錄每個消息Socket對象的示例:
import logging
import time
import zmq
class LogSocket(object):
socket = None
log = None
name = None
def __init__(self, socket, log=None, name=None):
"""wrap a socket so send/recv_multipart log their messages"""
self.socket = socket
if log is None:
logging.basicConfig(level=logging.INFO)
log = logging.getLogger().info
self.log = log
if name is None:
name = s.identity or repr(s)
self.name = name
def send_multipart(self, msg, *args, **kwargs):
self.log("%s sending: %r" % (self.name, msg))
return self.socket.send_multipart(msg, *args, **kwargs)
def recv_multipart(self, *args, **kwargs):
msg = self.socket.recv_multipart(*args, **kwargs)
self.log("%s received: %r" % (self.name, msg))
return msg
def __getattr__(self, key):
return getattr(self.socket, key)
ctx = zmq.Context.instance()
s = ctx.socket(zmq.REQ)
s.connect("tcp://127.0.0.1:5556")
# wrap the zmq socket in the Logging object:
# this object has exactly the same interface as
s = LogSocket(s, name="REQ")
for i in range(5):
time.sleep(1)
s.send_multipart(['hello', 'world'])
reply = s.recv_multipart()
# in this case, only _multipart methods are logged, so straight send/recv are not:
s.send("quiet")
s.recv()
用於處理序列/記錄/認證等在同一個地方的第二個目標的一個例子是在IPython中,所述Session object這比這個簡單的例子複雜得多,但它允許你集中代碼中的所有消息抽象。
你的應用程序喜歡什麼?我通常將send/recv/serialization邏輯包裝在一個單獨的對象中,這樣我就有''session_object.send(socket,message)''的代碼。這使我可以將序列化/認證/日誌記錄全部放在一個地方,並將它與Socket對象本身分開。 – minrk