我如何使用django设置zeromq

时间:2015-05-05 06:06:22

标签: jquery ajax django python-2.7 zeromq

我正在研究zeromq PUB / SUB,我在django上设置了zeromq PUB。

这是我用来设置zeromq的代码

from gevent_zeromq import zmq

我正在使用gevent_zeromq库

@api_view(['POST','GET'])
def NOTIFICATION(request):
if request.method == 'GET':
    return render_to_response('notifications.html',context)
if request.method == 'POST':
    message_json = json.dumps(request.data)
    message_load = json.loads(message_json)
    message = {message_load['msg']}
    ctx = zmq.Context()
    publisher = ctx.socket(zmq.PUB)
    publisher.bind("tcp://*:5566")
    time.sleep(1)
    while True:
        publisher.send_multipart("message:%s" % str(message))
        time.sleep(1)
    publisher.close()
    ctx.term() 
return Response('',status=200)

我正在使用ajax / jquery来处理来自throgh web的数据。

此代码正常运行,但当我从前端发送另一条消息时,它给了我错误:

 File "/home/admin/dx_man/dx_man/views.py", line 42, in NOTIFICATION
    publisher.bind("tcp://*:5566")
    File "socket.pyx", line 447, in zmq.core.socket.Socket.bind (zmq/core/socket.c:4312)
    ZMQError: Address already in use

如何使用ajax,django.zeromq。

我想只制作发布者,订阅者将是单独的,所以一旦发布者将在稍后发布消息,订阅者将处理它,但在这里我面临问题。

任何人都可以为我提供最佳解决方案,以便我可以处理来自Web界面的所有消息,并且我还希望将消息存储到数据库中,一旦消息发布,我将处理该消息。

1 个答案:

答案 0 :(得分:4)

由于您正在为每个请求启动ZMQ上下文和套接字,如果有任何事情阻止套接字和上下文在您的下一条消息之前终止并释放端口,那么当您尝试在同一端口上绑定时会导致问题试。

您有几个选择:

  • 创建一次上下文和套接字,并为每个请求重用它们(这是我的首选方法,只要Python进程在调用之间保持不变,它可能不是)
  • 删除time.sleep(1)次来电,因为这可能会导致流程花费太长时间才能关闭
  • 在关闭之前将ZMQ_LINGER设置为零,这将迫使它关闭,即使仍有消息等待...这可能意味着某些消息不会被发送,如果它们花费的时间太长。
  • 如果你绝对需要每次都发送你的信息来启动你的上下文和套接字,并且它们会足够快,以至于在下一个进入之前你不能打破最后一个,那么你应该是connect() - 在您的PUB套接字上bind() - 在您的SUB套接字上。

这是一个经典案例,你的PUB套接字是临时的,你的SUB套接字是可靠的,所以你的SUB套接字应该是你的“服务器”和bind()