2011-04-26 58 views
1

這是我第一個使用Tornado的項目...使用TornadIO + ZMQ構建消息服務 。我正在使用pyzmq的ioloop。 我一直在遇到這個問題的 iostream和websocket之間的遞歸循環,並且還無法找出原因。似乎客戶端 連接正常,併發送大量的消息,並收到罰款。有人 別的連接,並罰款一點,然後崩潰。我不知道如果我不是 正確處理斷開連接,或者如果消息中的東西是 導致龍捲風代碼中發生讀取錯誤。我的服務器中真正發生的一件事是,客戶端連接併發送消息,然後將消息廣播給其他人,這些消息也通過websockets連接。龍捲風:websocket和iostream之間的遞歸循環

也許有人可以告訴我什麼是真正發生在這裏,如果它的東西,我不處理 正確...

//啓動回溯的...

[E 110426 01:45:28 ioloop:295] Exception in I/O handler for fd 22 Traceback (most recent call last): File "/usr/local/lib/python2.6/dist-packages/pyzmq-2.1.4-py2.6-linux-x86_64.egg/zmq/eventloop/ioloop.py", line 282, in start self._handlers[fd](fd, events) File "/usr/local/lib/python2.6/dist-packages/pyzmq-2.1.4-py2.6-linux-x86_64.egg/zmq/eventloop/stack_context.py", line 133, in wrapped callback(*args, **kwargs) File "/usr/local/lib/python2.6/dist-packages/tornado-1.2.1-py2.6.egg/tornado/iostream.py", line 199, in _handle_events self._handle_read() File "/usr/local/lib/python2.6/dist-packages/tornado-1.2.1-py2.6.egg/tornado/iostream.py", line 258, in _handle_read if self._read_from_buffer():

// START:塊循環遞歸

File "/usr/local/lib/python2.6/dist-packages/tornado-1.2.1-py2.6.egg/tornado/iostream.py", line 325, in _read_from_buffer self._consume(loc + delimiter_len)) File "/usr/local/lib/python2.6/dist-packages/tornado-1.2.1-py2.6.egg/tornado/iostream.py", line 230, in _run_callback callback(*args, **kwargs) File "/usr/local/lib/python2.6/dist-packages/tornado-1.2.1-py2.6.egg/tornado/stack_context.py", line 173, in wrapped callback(*args, **kwargs) File "/usr/local/lib/python2.6/dist-packages/tornado-1.2.1-py2.6.egg/tornado/websocket.py", line 193, in _on_end_delimiter self._receive_message() File "/usr/local/lib/python2.6/dist-packages/tornado-1.2.1-py2.6.egg/tornado/websocket.py", line 178, in _receive_message self.stream.read_bytes(1, self._on_frame_type) File "/usr/local/lib/python2.6/dist-packages/tornado-1.2.1-py2.6.egg/tornado/iostream.py", line 149, in read_bytes if self._read_from_buffer(): File "/usr/local/lib/python2.6/dist-packages/tornado-1.2.1-py2.6.egg/tornado/iostream.py", line 314, in _read_from_buffer self._run_callback(callback, self._consume(num_bytes)) File "/usr/local/lib/python2.6/dist-packages/tornado-1.2.1-py2.6.egg/tornado/iostream.py", line 230, in _run_callback callback(*args, **kwargs) File "/usr/local/lib/python2.6/dist-packages/tornado-1.2.1-py2.6.egg/tornado/stack_context.py", line 173, in wrapped callback(*args, **kwargs) File "/usr/local/lib/python2.6/dist-packages/tornado-1.2.1-py2.6.egg/tornado/websocket.py", line 183, in _on_frame_type self.stream.read_until("\xff", self._on_end_delimiter) File "/usr/local/lib/python2.6/dist-packages/tornado-1.2.1-py2.6.egg/tornado/iostream.py", line 133, in read_until if self._read_from_buffer():

//循環回到開始(iostream中的325行)

任何幫助??????使用 IM的PyPI將龍捲風 1.2.1,tornadIO 0.0.4,2.1.4 zeromq和PyPI中pyzmq,在Ubuntu Linux

編輯: 這似乎從這個片段在我on_close起源()處理:

if self._client_sub and self._client_sub.stream: try: self._client_sub.stream.stop_on_recv() self._client_sub.stream.stop_on_err()

except Exception, e: 
    logging.error("Failed to close stream and sub socket on client disconnect", exc_info=True) 

,這裏是回溯:

[E 110425 20:52:50 messgr:202] Failed to close stream and sub socket on client disconnect Traceback (most recent call last): File "messgr.py", line 198, in on_close try: AttributeError: 'NoneType' object has no attribute 'stream' Traceback (most recent call last): File "/usr/lib/python2.6/logging/init.py", line 776, in emit msg = self.format(record) File "/usr/lib/python2.6/logging/init.py", line 654, in format return fmt.format(record) File "/usr/local/lib/python2.6/dist-packages/tornado-1.2.1-py2.6.egg/tornado/options.py", line 362, in format record.exc_text = self.formatException(record.exc_info) File "/usr/lib/python2.6/logging/init.py", line 416, in formatException traceback.print_exception(ei[0], ei[1], ei[2], None, sio) File "/usr/lib/python2.6/traceback.py", line 125, in print_exception print_tb(tb, limit, file) File "/usr/lib/python2.6/traceback.py", line 69, in print_tb line = linecache.getline(filename, lineno, f.f_globals) File "/usr/lib/python2.6/linecache.py", line 14, in getline lines = getlines(filename, module_globals) File "/usr/lib/python2.6/linecache.py", line 40, in getlines return updatecache(filename, module_globals)

什麼情況是,回溯發生之一。然後它似乎堆疊,併發生兩次,然後3次......無休止地。

+0

我發現了一些更多的日誌。它似乎源於我的on_close()處理程序中的這段代碼: – jdi 2011-04-26 21:37:21

回答

1

似乎非常相似,this問題

+0

對不起,我意識到它已經與庫的作者解決了。所以我會將其標記爲答案:-) – jdi 2011-07-14 21:58:49

+0

謝謝,但我想知道爲什麼我得到了這些負面代表! – calvinkrishy 2011-07-14 22:30:30

+0

也許因爲它不是一個答案,但更多的評論? – jdi 2011-07-21 23:49:16