我正在研究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界面的所有消息,并且我还希望将消息存储到数据库中,一旦消息发布,我将处理该消息。
答案 0 :(得分:4)
由于您正在为每个请求启动ZMQ上下文和套接字,如果有任何事情阻止套接字和上下文在您的下一条消息之前终止并释放端口,那么当您尝试在同一端口上绑定时会导致问题试。
您有几个选择:
time.sleep(1)
次来电,因为这可能会导致流程花费太长时间才能关闭connect()
- 在您的PUB套接字上bind()
- 在您的SUB套接字上。这是一个经典案例,你的PUB套接字是临时的,你的SUB套接字是可靠的,所以你的SUB套接字应该是你的“服务器”和bind()
。