采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
老师,在那个while循环的逻辑中代码不算是一直阻塞的吗?
这个问题提的很好,如果能理解到这个地方的阻塞意义就能知道协程的真正含义了,通过这个while循环我们应该能理解到两个非常非常重要的含义:
为什么我们强调异步框架是单线程的,因为所有的一些都是通过while循环来完成的,也就是基本上所有的协程都是在while这个主逻辑中执行的,至于这里为什么是阻塞的。这个也是合理的,因为这里的阻塞只会在一个地方阻塞就是有socket事件发生,因为所有的协程逻辑执行都是因为有socket事件发生,也就是说如果所有的socket都没有任何动静,那么所有的协程都应该是停止的状态
为什么说协程中不能有阻塞的方法也就是这个原因,因为所有的逻辑协程其实都是顺序执行的,所以任何一个协程中有阻塞事件发生那么后面所有的协程都会等着,这也是为什么每个协程中将socket事件交出去都要使用非阻塞的原因
虽然看似协程都是顺序执行的,但是只要我们遵循协程中不写阻塞方法的话,那么因为cpu的执行速度远远快于io操作,所以即便是顺序执行那整个过程运行也是非常快的
那我明白了,但是我还有一点不太懂,就是正常的requests请求,这个阻塞是在哪里体现的?是网络上,还是三次协议,产生了阻塞?还有一个问题,如果使用await关键字,不需要写回调函数吗?还是await本身就是产生了一个异步等待的操作,解释器走到await的时候跑到另外的一个函数执行操作。然后await赋予的这个函数的返回值就相当于回调的返回值?
是的,因为一个requests的get请求包含三个步骤,第一步 建立连接 第二步 发起url请求并等待返回 第三步 断开连接,这三个里面任何一个都会比较费时,比如建立连接和等待数据返回,其实对于操作系统来说,一个连接的请求是瞬间就发送出去了,所以大量时间在于等待服务响应上。对于url请求就更加明显了。发出去请求很快,发出去以后cpu是空等的状态,如果服务器很慢或者网路堵塞,cpu都是闲着的,断开连接也是一样。所以这里的阻塞对cpu的浪费是非常严重的
登录后可查看更多问答,登录/注册
异步IO并发编程/Form,ORM/aiomysql、peewee-async/epoll
946 18
1.8k 15
1.2k 15
1.1k 12
1.8k 11