为什么我无法在龙卷风中同时执行请求?

时间:2018-05-24 11:43:51

标签: python python-3.x http web tornado

龙卷风以下APP有2个终点。一个(/)很慢,因为它等待IO操作而其他(/ hello)很快。 我的要求是同时向两个端点发出请求。我观察到只有在完成第一个请求后才需要第二个请求。即使它是异步的,为什么它不能同时处理这两个请求? 如何让它同时处理?

编辑:我使用的是Windows 7,Eclipse IDE

****************Module*****************
import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    def get(self):
        self.do_something()
        self.write("FINISHED")
        self.finish()

    def do_something(self):
        inp = input("enter to continue")
        print (inp)
class HelloHandler(tornado.web.RequestHandler):

    def get(self):
        print ("say hello")
        self.write("Hello bro")
        self.finish(
def make_app():
    return tornado.web.Application([
    (r"/", MainHandler),
    (r"/hello", HelloHandler)
])
if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

1 个答案:

答案 0 :(得分:1)

只有你这样做才是异步的。 Tornado服务器在单个线程中运行。如果该线程被同步函数调用阻塞,则同时该线程上不会发生任何其他情况。 @tornado.web.asynchronous启用的是使用生成器:

@tornado.web.asynchronous
def get(self):
    yield from self.do_something()
    ^^^^^^^^^^

这个yield / yield from(在当前的Python版本await中)功能暂停该函数并允许其他代码在异步调用时在同一个线程上运行在其他地方完成(例如,等待来自数据库的数据,等待网络请求返回响应)。也就是说,如果Python不主动做某事但是等待外部进程完成,它可以为其他任务提供处理能力。但是由于你的函数在前台运行并且阻塞了线程,所以不会发生任何其他事情。

请参阅http://www.tornadoweb.org/en/stable/guide/async.htmlhttps://docs.python.org/3/library/asyncio.html