我们接着上小节的学习,现在我们进行一下测试,分别是非阻塞I/O,和使用select
实现的IO复用。
使用非阻塞io完成http请求
1 | import socket |
从上面代码中,我们看到当下面代码依赖于某个非阻塞I/O操作的时候,整体效率提示是不大的。
回调 + 事件循环+select(poll,epoll)
我们看下通过select
实现的I/O复用。
单线程中。。
1 | # 并发性高 |
三个函数的执行是:get_url —> connected —> readable
事件循环在IO多路复用中都存在的
回调的缺点:
- 可读性差
- 共享状态管理困难
- 异常处理困难,回调发生的异常不能上抛到我们真正调的函数
下面我们学习的协程就是解决这种代码编写复杂,维护困难的而生的。💪