请稍等 ...
×

采纳答案成功!

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

老师,访问同一个请求的并发问题

参照老师5-2课程中,将time.sleep改为非阻塞await asyncio.sleep。并发访问不同接口时发现确实可以实现异步效果,两个并发请求几乎同时完成。但访问同一个请求接口时,还是跟同步效果一样,一个请求结束后,才开始执行第二个请求。这是为什么呢?难道是访问不同请求接口时,每个请求接口生成一个协程task放入事件循环中,但同一个接口,同一时刻就只允许一个task放入事件循环中?

正在回答 回答被采纳积分+3

2回答

慕少4125144 2020-07-27 22:47:14

我做实验也是同样的结果,tornado官网的解释:

https://www.tornadoweb.org/en/stable/faq.html


确实是浏览器机制的问题,如果换成打开两个cmd用curl测试,就是没问题的

或者按照官网给的测试方法也是没有问题的

老师的可能测试方法不一样

0 回复 有任何疑惑可以回复我~
  • bobby #1
    赞一个,不同的浏览器可能会有不同的策略
    回复 有任何疑惑可以回复我~ 2020-07-30 16:21:22
bobby 2019-12-15 13:13:04

你的代码发上来我试试 两个接口即使一样也应该能同时完成

0 回复 有任何疑惑可以回复我~
  • 提问者 胖虎dad #1
    from tornado import web
    import tornado
    import asyncio
    
    class MainHandler(web.RequestHandler):
    
        async def get(self, *args, **kwargs):
            await asyncio.sleep(5)
            self.write("hello world")
    
    class MainHandler2(web.RequestHandler):
    
        async def get(self, *args, **kwargs):
            await asyncio.sleep(5)
            self.write("hello world2")
    
    if __name__ == '__main__':
        app = web.Application([
            ("/", MainHandler),
            ("/2/", MainHandler2)
        ], debug=True)
        app.listen(8888)
        tornado.ioloop.IOLoop.current().start()
    回复 有任何疑惑可以回复我~ 2019-12-15 15:28:44
  • bobby 回复 提问者 胖虎dad #2
    代码我测试过了 没有问题 你的5s太短了 看不出来 你设置为30再看看就知道了
    回复 有任何疑惑可以回复我~ 2019-12-17 11:01:01
  • 提问者 胖虎dad 回复 bobby #3
    tornado最新官方文档,解答问题一栏有提到。对同一接口的访问,主要是因为浏览器检测到,访问同一地址,就会先后执行
    回复 有任何疑惑可以回复我~ 2019-12-17 21:55:46
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信