торнадо: цикл рекурсии между websocket и iostream - PullRequest
1 голос
/ 26 апреля 2011

Это мой первый проект, использующий Tornado ... создание службы сообщений с TornadIO + ZMQ.Я использую izoop pyzmq.Я сталкивался с этой проблемой рекурсивного цикла между iostream и websocket, и пока не могу точно определить, почему.Кажется, клиент подключается нормально, отправляет множество сообщений и получает штраф.Кто-то еще подключается и немного подойдет, потом вылетит.Я не знаю, правильно ли я обрабатываю разъединение, или что-то в сообщении вызывает ошибку чтения в коде торнадо.Все, что на самом деле происходит на моем сервере, это то, что клиент подключается и отправляет сообщения, которые затем просто передаются всем остальным, кто также подключен через веб-сокеты.

Может быть, кто-то может сказать мне, что на самом деле происходит здесь, и еслиэто что-то, с чем я не справляюсь ...1010 *

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():

// Возвращаемся к началу (строка 325 в iostream)

Любая помощь ??????Я использую pypi tornado 1.2.1, tornadIO 0.0.4, zeromq 2.1.4 и 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()</p> <pre><code>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/<strong>init</strong>.py", line 776, in emit msg = self.format(record) File "/usr/lib/python2.6/logging/<strong>init</strong>.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/<strong>init</strong>.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 раза ... бесконечно.

1 Ответ

1 голос
/ 26 мая 2011

Кажется, очень похоже на этот вопрос

...