![](/img/trans.png)
[英]How to fix 'Install tornado itself to use zmq with the tornado IOLoop.' warning in Python
[英]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_close
和on_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.