我正试图用龙卷风编写一个非阻塞api。但是当我在本地尝试时,第一个请求就是阻塞API。我尝试使用不同的浏览器,但结果是一样的。
我打开了chrome和firefox。在chrome上,我使用http://localhost:8888/test-first,当它加载时,我立即从火狐转到http://localhost:8888/test-second。
我预计火狐的请求会在另一个还在加载的时候得到响应。但是它们都在等待,当第一个请求完成时,它们都完成了。
我的代码和输出:
期望控制台输出:
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.580509test_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()发布于 2017-11-23 10:49:07
for _ in range(1000000000):
pass这是一个CPU密集型任务。所以,它阻塞了整个服务器。龙卷风和几乎所有其他异步库都用于异步网络I/O,这意味着数据进入,数据输出-没有繁重的CPU任务。
要执行CPU绑定阻塞任务,您必须在一个单独的进程或线程中运行它,这样它就不会阻塞服务器。
但是无论如何,要像预期的那样获得输出,您可以使用First来暂停处理程序。
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)
...https://stackoverflow.com/questions/47442700
复制相似问题