首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >龙卷风不能异步工作

龙卷风不能异步工作
EN

Stack Overflow用户
提问于 2017-11-22 19:40:14
回答 1查看 188关注 0票数 0

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

我打开了chrome和firefox。在chrome上,我使用http://localhost:8888/test-first,当它加载时,我立即从火狐转到http://localhost:8888/test-second

我预计火狐的请求会在另一个还在加载的时候得到响应。但是它们都在等待,当第一个请求完成时,它们都完成了。

我的代码和输出:

期望控制台输出:

代码语言:javascript
复制
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

控制台输出

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-23 10:49:07

代码语言:javascript
复制
for _ in range(1000000000):
        pass

这是一个CPU密集型任务。所以,它阻塞了整个服务器。龙卷风和几乎所有其他异步库都用于异步网络I/O,这意味着数据进入,数据输出-没有繁重的CPU任务。

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

但是无论如何,要像预期的那样获得输出,您可以使用First来暂停处理程序。

代码语言:javascript
复制
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)
        ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47442700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档