我在8个Tornado实例前面有nginx,对于一些请求(注释的处理程序),我需要Tornado在ZeroMQ上推送消息。我在处理程序结束时(在我将响应发送到客户端之前)执行此操作:
# here is body of handler for comments
context = zmq.Context()
port = "5252"
socket = context.socket(zmq.PUSH)
socket.bind("tcp://*:%s" % port)
print "Running server on port: ", port
socket.send("Commented")
# here I flush response to client
但这是悬而未决的。这是处理器执行时推送到ZeroMQ的真正方法吗?
答案 0 :(得分:0)
这是在执行处理程序时推送到ZeroMQ的真正方法吗?
没有。每次调用请求处理程序时,您的代码都会调用zmq.Context()。这是不好的。应该只调用一次 - 通常在进程的最开始,也许在某种init处理程序中。您可以安全地在任意数量的线程之间共享上下文实例。
套接字创建和绑定也是如此 - 这应该在启动时完成一次。你必须更加小心插座。如果所有处理程序(应用程序,请求等)在每次调用处理程序时都在同一个线程中执行,那么您可以使用相同的套接字。
另一个问题是a"发送" -ing到PUSH套接字的方式。如http://api.zeromq.org/3-2:zmq-socket中所述,发送到PUSH套接字可能会在某些情况下阻止,您可能希望避免这种情况。将zmq.Poller与POLLOUT标志(以及0超时)一起使用以确定发送是否会阻塞。如果没有,那么马上发送。如果是这样,您必须决定是删除邮件还是将其存储在应用程序中以便稍后再试。