每当处理程序执行时需要将消息推送到zeromq保持挂起

时间:2014-05-10 13:44:23

标签: python tornado zeromq pyzmq

我在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的真正方法吗?

1 个答案:

答案 0 :(得分:0)

  

这是在执行处理程序时推送到ZeroMQ的真正方法吗?

没有。每次调用请求处理程序时,您的代码都会调用zmq.Context()。这是不好的。应该只调用一次 - 通常在进程的最开始,也许在某种init处理程序中。您可以安全地在任意数量的线程之间共享上下文实例。

套接字创建和绑定也是如此 - 这应该在启动时完成一次。你必须更加小心插座。如果所有处理程序(应用程序,请求等)在每次调用处理程序时都在同一个线程中执行,那么您可以使用相同的套接字。

另一个问题是a"发送" -ing到PUSH套接字的方式。如http://api.zeromq.org/3-2:zmq-socket中所述,发送到PUSH套接字可能会在某些情况下阻止,您可能希望避免这种情况。将zmq.Poller与POLLOUT标志(以及0超时)一起使用以确定发送是否会阻塞。如果没有,那么马上发送。如果是这样,您必须决定是删除邮件还是将其存储在应用程序中以便稍后再试。