簡體   English   中英

如何解決Tornado + ZMQ錯誤

[英]How to resolve Tornado + ZMQ error

和其他人一樣,我正在使用Tornado(SockJS-Tornado)+ pyzmq進行聊天PoC。

總的想法是擁有N個龍卷風實例,每個實例都有連接的websocket客戶端,通過ZMQ設備交換消息。 換句話說,實例A上的websocket客戶端發布到ZMQ Forwarder。 實例B&C具有訂閱轉發器的處理程序,以便將匹配的主題轉發給B&C的websocket客戶端。是的,B&C上的客戶端也有發布到轉發器的發布者套接字。

這一切都運行正常但我的問題是,如果其中一個連接的客戶端意外斷開連接(例如關閉或刷新瀏覽器選項卡),那么我會收到大量的錯誤,如下所示:

ERROR:tornado.application:Exception in callback None
Traceback (most recent call last):
  File ".../tornado/ioloop.py", line 836, in start
  fd_obj, handler_func = self._handlers[fd]
KeyError: 246850817
ERROR:tornado.application:Exception in callback None
Traceback (most recent call last):
  File ".../tornado/ioloop.py", line 836, in start
  fd_obj, handler_func = self._handlers[fd]
KeyError: 246850817

因此,在應用程序級別,只有一個Context,但每個Handler實例化都會獲得自己的Publisher和Subscriber套接字。 訂閱者套接字使用ZMQStream,如下所示:

   def _set_up_sockets(self):
    self.publisher = self.context.socket(zmq.PUB)
    self.publisher.connect('tcp://127.0.0.1:5559')
    self.subscriber = self.context.socket(zmq.SUB)
    self.subscriber.connect('tcp://127.0.0.1:5560')
    self.subscriber.setsockopt(zmq.SUBSCRIBE, "_NOROOM_")
    stream = zmqstream.ZMQStream(self.subscriber,
                                 io_loop=self.session.server.io_loop)
    stream.on_recv(self.echo)

傳遞給ZMQStream的ioloop是在應用程序啟動時創建的全局io_loop:

ioloop.install()
io_loop = IOLoop.instance()

它實際上是Tornado IOLoop的ZMQ子類的一個實例。 知道是什么導致了這個錯誤嗎? 我有一些清理方法, on_connection_closeon_close但它們似乎在任何時候都沒有被調用。

哦,這是Python 2.7.8,ZeroMQ 4.0.4,PyZMQ 14.4.0(同樣的事情發生在14.3.1)。

提前致謝

確保在主線程內調用_set_up_sockets。

由於您只有一個IOLoop,因此zmq FAQ清楚地表明您需要在同一個線程中創建和使用套接字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM