请稍等 ...
×

采纳答案成功!

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

关于时间虚幻中while循环的问题

老师,在那个while循环的逻辑中代码不算是一直阻塞的吗?

正在回答

1回答

bobby 2019-07-30 15:03:08

这个问题提的很好,如果能理解到这个地方的阻塞意义就能知道协程的真正含义了,通过这个while循环我们应该能理解到两个非常非常重要的含义:

  1. 为什么我们强调异步框架是单线程的,因为所有的一些都是通过while循环来完成的,也就是基本上所有的协程都是在while这个主逻辑中执行的,至于这里为什么是阻塞的。这个也是合理的,因为这里的阻塞只会在一个地方阻塞就是有socket事件发生,因为所有的协程逻辑执行都是因为有socket事件发生,也就是说如果所有的socket都没有任何动静,那么所有的协程都应该是停止的状态

  2. 为什么说协程中不能有阻塞的方法也就是这个原因,因为所有的逻辑协程其实都是顺序执行的,所以任何一个协程中有阻塞事件发生那么后面所有的协程都会等着,这也是为什么每个协程中将socket事件交出去都要使用非阻塞的原因


虽然看似协程都是顺序执行的,但是只要我们遵循协程中不写阻塞方法的话,那么因为cpu的执行速度远远快于io操作,所以即便是顺序执行那整个过程运行也是非常快的

0 回复 有任何疑惑可以回复我~
  • 提问者 兰小宇 #1
    那我明白了,但是我还有一点不太懂,就是正常的requests请求,这个阻塞是在哪里体现的?是网络上,还是三次协议,产生了阻塞?还有一个问题,如果使用await关键字,不需要写回调函数吗?还是await本身就是产生了一个异步等待的操作,解释器走到await的时候跑到另外的一个函数执行操作。然后await赋予的这个函数的返回值就相当于回调的返回值?
    回复 有任何疑惑可以回复我~ 2019-07-30 15:19:55
  • bobby 回复 提问者 兰小宇 #2
    是的,因为一个requests的get请求包含三个步骤,第一步 建立连接 第二步 发起url请求并等待返回 第三步 断开连接,这三个里面任何一个都会比较费时,比如建立连接和等待数据返回,其实对于操作系统来说,一个连接的请求是瞬间就发送出去了,所以大量时间在于等待服务响应上。对于url请求就更加明显了。发出去请求很快,发出去以后cpu是空等的状态,如果服务器很慢或者网路堵塞,cpu都是闲着的,断开连接也是一样。所以这里的阻塞对cpu的浪费是非常严重的
    回复 有任何疑惑可以回复我~ 2019-07-31 17:34:50
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信