0
0 комментариев

Доброго времени суток всем.

Планирую создать чат, используя tornado в качестве comet-сервера. С tornado знакомиться только начал, поэтому для начала набросал простейший сервер с двумя URL.

При обращении к одному, соединение должно удерживаться до появления сообщений. По второму URL сервер принимает сообщения.

В следующем коде проблема в том, что каждый GET, ожидающий новые сообщения начинает обрабатываться только после того, как предыдущий GET на этот же URL выполнится полностью. Хотя иногда (очень редко, обычно при первом запуске скрипта), все GET обрабатываются как нужно. Проверяю работу, открывая 3 странички: 2 обращаются к URL, ожидающему сообщения, 1 — отсылает сообщение.

Не могу понять, почему вместо вывода:

New waiter, count: 1
New waiter, count: 2
Message sended

получается:

New waiter, count: 1
Message sended
New waiter, count: 1
Message sended

Код:

import tornado.ioloop
import tornado.web
from tornado.concurrent import Future
from tornado import gen
 
waiters = []
 
class MessageSender(tornado.web.RequestHandler):
 
    @gen.coroutine
    def get(self):
        myFuture = Future()
        waiters.append(myFuture)
        print('New waiter, count: {}'.format(len(waiters)))
        message = yield myFuture
        self.write(message)
 
 
class MessageReceiver(tornado.web.RequestHandler):
 
    def get(self):
        global waiters
        for waiter in waiters:
            waiter.set_result('Some message')
        waiters = []
        print('Message sended')
        self.write('OK')
 
if __name__ == '__main__':
    app = tornado.web.Application([
        (r'/tornado/sendmsg', MessageReceiver),
        (r'/tornado/waitmsg', MessageSender),
    ])
    app.listen(8889)
    tornado.ioloop.IOLoop.current().start()


Добавить комментарий