Асинхронный торнадо-сервер с асинхронным возвратом - PullRequest
1 голос
/ 13 января 2020
class NoBlockingHnadler(tornado.web.RequestHandler):
    executor = ThreadPoolExecutor(4)

    @run_on_executor
    def sleep(self, second):
        #time.sleep(second)
        #return second
        for i in range(5):
            time.sleep(second)
            yield i

    @gen.coroutine
    def get(self):
        #second = yield self.sleep(1)
        #self.write("noBlocking Request: {}".format(second))

        for second in self.sleep(1):
            print(second)
            self.write("noBlocking Request: {}\n".format(second))
            self.flush()
        self.finish()

def make_app():
    return tornado.web.Application([
        (r"/noblock", NoBlockingHnadler),
    ], autoreload=True)

if __name__ == "__main__":
    app = make_app()
    app.listen(8518)
    tornado.ioloop.IOLoop.current().start()

Это, похоже, не работает, что сообщило об ошибке следующим образом:

за секунду в self.sleep (1): TypeError: объект 'Future' не повторяется

Как правильно реализовать асинхронный сервер торнадо с асинхронным возвратом? Большое спасибо.

1 Ответ

0 голосов
/ 16 января 2020
from tornado.ioloop import IOLoop


def sleep(second):
    for i in range(5):
        time.sleep(second)
        return i

class NoBlockingHnadler(tornado.web.RequestHandler):

    async def get(self):

        result = await IOLoop.current().run_in_executor(None,sleep,*(1))

        for second in result:
            print(second)
            self.write("noBlocking Request: {}\n".format(second))
            self.finish()

def make_app():
    return tornado.web.Application([
        (r"/noblock", NoBlockingHnadler),
    ], autoreload=True)

if __name__ == "__main__":
    app = make_app()
    app.listen(8518)
    tornado.ioloop.IOLoop.current().start()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...