ymy
ymy

Reputation: 27

In tornado ,how to make these functions async?

Here is my code:

#/test
class Test(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    @tornado.gen.coroutine
    def get(self):
        res = yield self.inner()
        self.write(res)

    @tornado.gen.coroutine
    def inner(self):
        import time
        time.sleep(15)
        raise tornado.gen.Return('hello')

#/test_1
class Test1(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    @tornado.gen.coroutine
    def get(self):
        res = yield self.inner()
        self.write(res)

    @tornado.gen.coroutine
    def inner(self):
        raise tornado.gen.Return('hello test1')

When I fetch /test and then fetch /test_1, but /test_1 does not response until /test responsed, how to fixed it?

Upvotes: 0

Views: 78

Answers (2)

A. Jesse Jiryu Davis
A. Jesse Jiryu Davis

Reputation: 24027

You've hit both the frequently-asked questions:

http://www.tornadoweb.org/en/stable/faq.html

First, please don't use time.sleep() in a Tornado application, use gen.sleep() instead. Second, be aware that most browsers won't fetch two pages from the same domain simultaneously: use "curl" or "wget" to test your application instead.

Upvotes: 0

Xiaoqi Chu
Xiaoqi Chu

Reputation: 1567

Don't use time.sleep(). time.sleep() will block cpu loop. Instead, use

yield tornado.gen.Task(tornado.ioloop.IOLoop.instance().add_timeout,
                               time.time() + sleep_seconds)

Upvotes: 2

Related Questions