2015-05-05 28 views
4

我的工作zeromq PUB/SUB和我setuped Django上zeromq PUB設置zeromq。我如何使用Django

這是我的代碼,我使用了設置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) 

我使用數據來throgh網絡阿賈克斯/ 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做到這一點。

我想要只出版商,用戶會單獨所以一旦出版商將在稍後發佈的消息,在用戶將處理它,但在這裏我面對的問題。

誰能給我吧最佳的解決方案,這樣我可以處理來自網絡接口的所有消息,我也想將消息存儲到數據庫中,我會處理一次信息將被公佈。

回答

4

既然你旋轉了每個請求的ZMQ上下文和插座,如果有什麼阻止終止和你的下一個消息之前釋放的端口,然後在插座和背景,這將導致一個問題,當你試圖在同一綁定端口再次。

你有兩個選擇:

  • 創建上下文和插座一次,並重新使用他們爲每個請求(這將是我的首選方法,只要Python進程是在調用持久,它可能不是)
  • 刪除time.sleep(1)電話,因爲他們可能會導致進程需要很長時間才能關閉
  • 集ZMQ_LINGER爲零關閉之前,這將迫使其關閉,即使仍有等待的消息......這可能意味着某些消息不會被髮送,如果它們耗時過長。
  • 如果您確實需要每次旋轉起來你的背景和插座發送郵件,他們會來足夠快,你不能打破最後一個落了下一個進來之前,那麼你就應該connect() -ing在您的PUB插座和bind() -ing在您的SUB插座上。

這是一個經典的案例,其中你的PUB插座是臨時的,你的SUB插座是可靠的,所以你的SUB插座應該是你的「服務器」和bind()

+0

感謝您的回答,那就是你的方法現在的工作 –

+0

你介意指定的選項爲你工作? – Jason

+0

我做到了,而真: publisher.send(「message:%s」%str(message)) #time.sleep(1) publisher.close() –