关于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回答
-
首先不要认为任何方法加上async就会快,这种想法是不对的,async表示当前的函数式一个协程,但是协程中如果调用了同步的方法比如sleep,name这样这个方法仍然是同步的, 核心是要调用非阻塞方法,比兔tornado提供的sleep,调用sleep之后立马返回一个协程对象,这个时候当前的async方法才能达到协程的效果
152020-01-15 -
听,美妙的旋律
2020-01-08
第一个使用 await asyncio.sleep(5) 连续两次访问,第一次是5秒,第二次也是10秒,要怎样处理每次访问都是5秒?
052020-01-15
相似问题