首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

并发编程之 协程加强篇

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

下节预估:协程深入、爬虫小案例

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190107G0KF3R00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券