我正在尝试用龙卷风写一个非阻塞的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()))
答案 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