【问题标题】:How do i setup zeromq with django我如何用 django 设置 zeromq
【发布时间】:2015-07-14 17:42:24
【问题描述】:

我正在研究 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 来获取通过网络传输的数据。

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

 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 来做到这一点。

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

谁能给我最好的解决方案,以便我可以处理来自网络界面的所有消息,并且我还想将消息存储到数据库中,一旦消息发布,我将处理。

【问题讨论】:

    标签: jquery ajax django python-2.7 zeromq


    【解决方案1】:

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

    你有几个选择:

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

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

    【讨论】:

    • 我在 True 时做到了:publisher.send("message:%s" % str(message)) #time.sleep(1) publisher.close()
    • 消息发送工作,但我不知道为什么会收到此错误文件“socket.pyx”,第 518 行,在 zmq.core.socket.Socket.send (zmq/core/socket.send) 中c:4609) 文件“socket.pyx”,第 84 行,在 zmq.core.socket._check_closed (zmq/core/socket.c:1106) ZMQError: Operation not supported
    • 如果您遇到新错误,最好打开一个新问题。
    猜你喜欢
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    相关资源
    最近更新 更多