龙卷风不会异步工作(Tornado doesn't work asynchronously)

2019-10-31 05:52发布

我想写与龙卷风非阻塞API。 但是,当我尝试在当地的第一个请求阻塞API。 我试图用不同的浏览器,但结果是一样的。

我打开Chrome和Firefox。 在Chrome我去的http://本地主机:8888 /测试第一 ,它加载时我立刻去的http://本地主机:8888 /测试秒从Firefox。

我期待从Firefox的请求将,而另一人仍在加载来回答。 但他们两人都在等待,当第一个请求完成他们两人完成。

我的代码和输出:

期待控制台输出:

First request: 2017-11-22 22:23:22.093497
Second request: 2017-11-22 22:23:24.580052
Second answer: 2017-11-22 22:23:25.580509
First answer: 2017-11-22 22:23:37.579263

控制台输出

First request: 2017-11-22 22:23:22.093497
First answer: 2017-11-22 22:23:37.579263
Second request: 2017-11-22 22:23:37.580052
Second answer: 2017-11-22 22:23:37.580509

test_first.py:

import tornado.web
import datetime


class First(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    async def get(self):
        print("First request: " + str(datetime.datetime.now()))
        for _ in range(1000000000):
            pass
        self.set_status(200)
        self.write("OK")
        self.finish()
        print("First answer: " + str(datetime.datetime.now()))

test_second.py:

import tornado.web
import datetime


class Second(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    async def get(self):
        print("Second request: " + str(datetime.datetime.now()))
        self.set_status(200)
        self.write("OK")
        self.finish()
        print("Second answer: " + str(datetime.datetime.now()))

app.py:

import tornado
from test_first import First
from test_second import Second


class Application(tornado.web.Application):
    def __init__(self):
        ENDPOINTS = [
            # USERS #
            (r"/test-first", First),
            (r"/test-second", Second)
        ]

        SETTINGS = {
            "debug": True,
            "autoreload": True,
            "serve_traceback": True,
            "compress_response": True
        }

        tornado.web.Application.__init__(self, ENDPOINTS, SETTINGS)


if __name__ == "__main__":
    print("dinliyor...")
    Application().listen(8888)
    tornado.ioloop.IOLoop.instance().start()

Answer 1:

for _ in range(1000000000):
        pass

这是一个CPU密集型任务。 因此,它会阻止整个服务器。 龙卷风,和几乎所有其他异步库,是做异步网络I / O,这意味着,数据进来,数据熄灭 - 没有沉重CPU任务。

要执行的约束阻止任务CPU,你必须在一个单独的进程中运行,或者线程,以便它不会阻止服务器。

但无论如何,让你所期望的输出,则可以暂停First使用处理器tornado.gen.sleep

class First(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    async def get(self):
        print("First request: " + str(datetime.datetime.now()))

        await tornado.gen.sleep(5) # sleep for 5 seconds

        self.set_status(200)
        ...


文章来源: Tornado doesn't work asynchronously