Я пишу демо-версию кометы с торнадо и tornadoredis, демо может работать, но иногда происходит ошибка, я понятия не имею, как это исправить. кто-нибудь может мне помочь?tornado finish() называется дважды
Ошибка:
[E 150410 18:18:44 web:1421] Uncaught exception GET /comet?channelKey=channel%3Awx4g1nej7fuu&message_id=193 (127.0.0.1)
HTTPServerRequest(protocol='http', host='tornado.test.com', method='GET', uri='/comet?channelKey=channel%3Awx4g1nej7fuu&message_id=193', version='HTTP/1.1', remote_ip='127.0.0.1', headers={'Remote-Addr': 'xxx', 'Service': 'android', 'X-Forwarded-For': 'xxx', 'User-Agent': 'Apache-HttpClient/UNAVAILABLE (java 1.4)', 'Host': 'tornado.test.wolonge.com', 'X-Requested-With': 'XMLHttpRequest', 'X-Real-Ip': 'xxx', 'Cookie': 'logintoken=gsvimqqefr8f9duu66emjrbbe5_8be6AsNqW%2B3kwH7OsnT0OAKbZNNqnzabDIVcFDE8TvyozQ7h'})
Traceback (most recent call last):
File "/usr/lib64/python2.6/site-packages/tornado/web.py", line 1302, in _stack_context_handle_exception
raise_exc_info((type, value, traceback))
File "/usr/lib64/python2.6/site-packages/tornado/web.py", line 1489, in wrapper
result = method(self, *args, **kwargs)
File "/home/wwwroot/wolongge_mobile/app/tornado_push/models/ws_handle.py", line 53, in ready_finish
self.finish(res)
File "/usr/lib64/python2.6/site-packages/tornado/web.py", line 863, in finish
raise RuntimeError("finish() called twice. May be caused "
RuntimeError: finish() called twice. May be caused by using async operations without the @asynchronous decorator
И мой код здесь:
class GroupChat(tornado.web.RequestHandler):
def initialize(self):
print 'GroupChat here'
self.c = tornadoredis.Client(host=CONFIG['REDIS_HOST'], port=CONFIG['REDIS_PORT'], password=CONFIG['REDIS_AUTH'])
@tornado.gen.coroutine
@tornado.web.asynchronous
def get(self):
try:
self.key = self.get_argument('channelKey')
# print 'key:%s' % self.key
self.key = url_unescape(self.key);
# print 'key:%s' % self.key
if(self.key):
yield tornado.gen.Task(self.c.subscribe, self.key)
self.c.listen(self.on_message)
except Exception, e:
self.c.disconnect()
self.ready_finish('Bad Request (Missing argument)')
print e
pass
@tornado.web.asynchronous
def on_message(self, msg):
if (msg.kind == 'message'):
print msg
message_id = int(self.get_argument('message_id'))
max_message_id = int(msg.body)
if(message_id < max_message_id):
self.ready_finish('1')
else:
self.ready_finish('0')
elif (msg.kind == 'unsubscribe'):
self.c.disconnect()
@tornado.web.asynchronous
def ready_finish(self, res):
if (self.c.subscribed):
self.c.unsubscribe(self.key)
self.finish(res)
def on_connection_close(self):
print 'on_connection_close here'
другой Ques, @ tornado.web.asynchronous правильный способ использовать? каждый метод имеет @ tornado.web.асинхронный ...