龙卷风不会异步工作

时间:2017-11-22 19:40:14

标签: python tornado nonblocking

我正在尝试用龙卷风写一个非阻塞的api。但是当我在本地尝试它时,第一个请求是阻止API。我尝试使用不同的浏览器,但结果是一样的。

我打开了chrome和firefox。在Chrome上我会去 http://localhost:8888/test-first ,当它正在加载时我立即从firefox中去 http://localhost:8888/test-second

我期待来自firefox的请求将在另一个仍在加载时得到解答。但是他们两个都在等待,当第一个请求完成时,两个都完成了。

我的代码和输出:

期待控制台输出:

RewriteRule  ^files/([0-9]+)/([0-9]+)/([0-9]+)/(.*)$  /laravel/api/$1/$3?filename=$4

控制台输出

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

test_first.py:

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_second.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()))

app.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()))

1 个答案:

答案 0 :(得分:2)

.rightButton {
    position: relative;
    z-index: 99;
    float: right;
}

这是一项CPU密集型任务。因此,它会阻止整个服务器。 Tornado和几乎所有其他异步库都用于执行异步网络I / O,这意味着数据进入,数据耗尽 - 没有繁重的CPU任务。

要执行CPU绑定阻塞任务,您必须在单独的进程或线程中运行它,以便它不会阻塞服务器。

但无论如何,为了获得您期望的输出,您可以使用for _ in range(1000000000): pass 暂停First处理程序。

tornado.gen.sleep