关于Handler中 不能写同步IO的问题

来源:5-2 tornado中为什么不能写同步的方法

慕798262113

2018-11-12

在 5-2 tornado中为什么不能写同步的方法 中

告诉我们使用async 不使用同步的方法,但是我运行了这段代码
1.两个网页同时访问 / ------>第一个5秒 第二个10秒返回
2.一个/ 一个/2/ ,第一个五秒,第二个再第一个返回后,马上返回
经检测,加上async 也是同步的方法啊
我理解的效果应该是这样的
1.两个网页同时访问 / ------>第一个5秒 第二个5秒返回
2.一个/ 一个/2/ ,第一个五秒,第二个访问的时候,立马返回,第一个sleep并不会阻塞其他访问。

这是课程的代码

import time

from tornado import web
import tornado
web.URLSpec

class MainHandler(web.RequestHandler):
    #当客户端发起不同的http方法的时候, 只需要重载handler中的对应的方法即可
    async def get(self, *args, **kwargs):
        time.sleep(5)
        self.write("hello world")

class MainHandler2(web.RequestHandler):
    #当客户端发起不同的http方法的时候, 只需要重载handler中的对应的方法即可
    async def get(self, *args, **kwargs):
        self.write("hello world2")

if __name__ == "__main__":
    app = web.Application([
        ("/", MainHandler),
        ("/2/", MainHandler2)
    ], debug=True)
    app.listen(8888)
`在这里输入代码`    tornado.ioloop.IOLoop.current().start()
写回答

2回答

bobby

2018-11-13

首先不要认为任何方法加上async就会快,这种想法是不对的,async表示当前的函数式一个协程,但是协程中如果调用了同步的方法比如sleep,name这样这个方法仍然是同步的, 核心是要调用非阻塞方法,比兔tornado提供的sleep,调用sleep之后立马返回一个协程对象,这个时候当前的async方法才能达到协程的效果

1
5
bobby
回复
听,美妙的旋律
我这里试过没有问题你可以留下qq 我加你看看
2020-01-15
共5条回复

听,美妙的旋律

2020-01-08

第一个使用 await asyncio.sleep(5) 连续两次访问,第一次是5秒,第二次也是10秒,要怎样处理每次访问都是5秒?

0
5
听,美妙的旋律
回复
bobby
我上面的评论,慕课网前端出现bug了,显示超出去了
2020-01-15
共5条回复

Tornado从入门到进阶 打造支持高并发的技术论坛

异步IO并发编程/Form,ORM/aiomysql、peewee-async/epoll

593 学习 · 350 问题

查看课程