请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

在 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 14:05:43

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

1 回复 有任何疑惑可以回复我~
  • 提问者 慕798262113 #1
    ????老师这样一讲,顿时清晰很多,看到这里想不通,原来问题在这里。
    回复 有任何疑惑可以回复我~ 2018-11-13 15:34:32
  • 提问者 慕798262113 #2
    非常感谢!
    回复 有任何疑惑可以回复我~ 2018-11-13 20:06:08
  • bobby 回复 提问者 慕798262113 #3
    好的,加油
    回复 有任何疑惑可以回复我~ 2018-11-14 13:26:21
听,美妙的旋律 2020-01-08 20:40:19

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

0 回复 有任何疑惑可以回复我~
  • bobby #1
    asyncio.sleep(5)是停止5s,连续两个请求过来 第二个请求不是等10s,而是也等5s,你可以把这个设置长一点对比观察一下
    回复 有任何疑惑可以回复我~ 2020-01-10 13:20:45
  • 我试了延长10s也是的,我对过时间了。代码如下,你看看有什么问题么
    
    from tornado import web
    import tornado
    from tornado.options import  define,options
    
    define('port',default=8080,type=int)
    options.parse_command_line()
    
    import asyncio
    
    class MainHandler(web.RequestHandler):
        async def get(self,*args,**kwargs):
            print("1111")
            await asyncio.sleep(10)
            print("2222")
            self.write("成功1")
            self.finish()
    
    
    if __name__=="__main__":
        app=web.Application([("/",MainHandler)],debug=True)
        app.listen(options.port)
    
        tornado.ioloop.IOLoop.current().start()
    回复 有任何疑惑可以回复我~ 2020-01-13 10:09:43
  • 我这里刚才用你的代码测试过,同时发起两个请求,第一个请求和第二个请求都是10s后结束啊
    回复 有任何疑惑可以回复我~ 2020-01-15 00:51:04
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信