3.5.asyncio
3.5.1.上节回顾
3.5.2.asyncio引入
1.简单案例
3.5.3.批量任务
1.旧版本实现(不推荐)
1.旧版新用
2.新版本实现
关于高级和低级API的说明
3.5.4.回调函数
1.回调函数获取返回值
2.回调函数传参扩展
3.5.5.异常相关
常见异常
asyncio中常见异常
Python常见异常
3.5.asyncio
官方文档:https://docs.python.org/3/library/asyncio.html
开发中常见错误:https://docs.python.org/3/library/asyncio-dev.html
代码示例:https://github.com/lotapp/BaseCode/tree/master/python/5.concurrent/ZCoroutine
3.5.1.上节回顾
上次说了下
协程演变过程
,这次继续,先接着上次的说:
像 是可以生成器和 和 混用的,那 呢?(NetCore不可以混用)
我们的 和 虽然和 不是一个概念,但是可以理解为 上面这段代码你可以理解为:
PS:Python默认和NetCore一样,不能直接混用,如果你一定要混用,那么得处理下( 也行)
3.5.2.asyncio引入
在今天之前,协程我们是这么实现的: + +
现在可以通过官方提供的 (可以理解为协程池)来实现了(第三方还有一个 【基于C写的 库( 也是基于这个库)】)
PS: 的使用非常简单,只要在获取事件循环前将 的事件循环策略设置为 的:
1.简单案例
先看个简单的协程案例:
输出:
简单说下, 是python3.7才简化出来的语法(类比NetCore的 )看看源码就知道了:
新版本其实就是使用了一个新的 去启动
PS: 也可以这样去使用:获取loop 再替换原生的loop
3.5.3.批量任务
1.旧版本实现(不推荐)
输出:(tasks替换成这个也一样: )
然后我们再看看这个 是个啥:(回顾:https://www.cnblogs.com/dotnetcrazy/p/9528315.html#wait()说明)
如果你不想大改动,只是平滑过度到新版本,可以使用 来替换
1.旧版新用
PS:官方推荐使用 ,然后值得说的就是 ==>官方准备在未来版本废弃它,所以我推荐大家这样写:
输出:(PS:用 直接替换 也行)
其实理解起来很简单,而且和 以及 它们统一了,只要是 就返回一个( | ), 就是一个
2.新版本实现
输出:(语法简化太多了,用起来特别简单)
关于参数需要加 解包的说明 ==> 看看函数定义就秒懂了:
关于高级和低级API的说明
asyncio的高级( )API一般用于这几个方面:(开发基本够用了)
并行运行Python协同程序并完全控制它们的执行
网络通信( )和进程间通信( )
子进程( )相关
通过队列( )分配任务( )
同步( )并发代码
低级( )API一般这么用:(事件循环和回调会用下,其他基本不用)
创建和管理事件循环,为网络、子进程、信号处理( )等提供异步( )API
为传输使用高效协议
使用 语法桥接基于回调的库和代码
3.5.4.回调函数
回调一般不利于代码维护,现在基本上是尽量不用了(异步代码用起来都和同步没多大差别了,回调也就没那么大用处了)
1.回调函数获取返回值
上面说的获取返回值,其实也可以通过回调函数来获取:
输出:()
2.回调函数传参扩展
实例:
输出:(PS:通过偏函数传过来的参数在最前面)
3.5.5.异常相关
之前说的 可能得到结果也可能得到异常有些人可能还不明白 ==> 其实你把他看出同步代码(PS:协程的目的就是像写同步代码一样进行异步编程)就好理解了,函数执行要么得到结果要么得到返回值
看个异常的案例:
输出:(和同步代码没差别,可能出异常的部分加个异常捕获即可)
注意一个东西:
再一眼旧版怎么用:(PS:基本差不多,下次全部用新用法了)
常见异常
Python3调试过程中的常见异常:https://www.cnblogs.com/dotnetcrazy/p/9192089.html
asyncio中常见异常
官方文档:
:
任务超时引发的异常
:
任务取消引发的异常
:
内部状态无效引发
:读取未完成引发的错误:
不完整: 在到达流结束之前读取字节字符串(读取了不完整的字符串就转换了)
不清楚读多少: 预期读取的字节总数未知
:
超出缓冲区引发的异常
:
系统调用不适用于给定的套接字或文件类型(系统调用类型不匹配导致的)
Python常见异常
有些异常官方没有写进去,我补了一些常用的异常:
: 引发的异常(目的:让Python解释器退出)
:用户Ctrl+C终止程序引发的异常
:生成器或者协程关闭的时候产生的异常(特别注意)
:所有内置异常(非系统退出)或者用户定义异常的基类
UnicodeError
UnicodeDecodeError
UnicodeEncodeError
UnicodeTranslateError
:缩进有问题
:当缩进包含不一致的制表符和空格使用时引发
:为实现报错(比如调用了某个不存在的子类方法)
:递归程度太深引发的异常
:系统调用不适用于给定的套接字或文件类型
BlockingIOError
ChildProcessError
ConnectionError
BrokenPipeError
ConnectionAbortedError
ConnectionRefusedError
ConnectionResetError
FileExistsError
FileNotFoundError
InterruptedError
IsADirectoryError
NotADirectoryError
PermissionError
ProcessLookupError
:系统函数执行超时时触发
UnboundLocalError
IndexError
KeyError
ModuleNotFoundError
:读取操作未完成引发的错误
FloatingPointError
OverflowError
ZeroDivisionError
:和 区分开
: 内部状态无效引发
:超出缓冲区引发的异常
: 引发的异常:
: 引发的异常
ArithmeticError
:当断言 语句失败时引发
:当属性引用或赋值失败时引发
BufferError
ImportError
LookupError
MemoryError
NameError
:当系统函数返回与系统相关的错误时引发
:引用错误(对象被资源回收或者删除了)
:出错了,但是检测不到错误类别时触发
:语法错误时引发(粘贴代码经常遇到)
SystemError
:类型错误
ValueError
Warning
DeprecationWarning
PendingDeprecationWarning
RuntimeWarning
SyntaxWarning
UserWarning
FutureWarning
ImportWarning
UnicodeWarning
BytesWarning
ResourceWarning
下节预估:协程深入、爬虫小案例
领取专属 10元无门槛券
私享最新 技术干货