当前位置:
首页 > Python基础教程 >
-
Python3标准库:asyncio异步I/O、事件循环和并发工具(4)
'
async def main(loop):
print('creating task')
task = loop.create_task(task_func())
print('canceling task')
task.cancel()
print('canceled task {!r}'.format(task))
try:
await task
except asyncio.CancelledError:
print('caught error from canceled task')
else:
print('task result: {!r}'.format(task.result()))
event_loop = asyncio.get_event_loop()
try:
event_loop.run_until_complete(main(event_loop))
finally:
event_loop.close()
这个例子会在启动事件循环之前创建一个任务,然后取消这个任务。结果是run_unitl_complete()方法抛出一个CancelledError异常。
如果一个任务正在等待另一个并发运行的操作完成,那么倘若在这个等待时刻取消任务,则其会通过此时产生的一个CancelledError异常通知任务将其取消。
- import asyncio
- async def task_func():
- print('in task_func, sleeping')
- try:
- await asyncio.sleep(1)
- except asyncio.CancelledError:
- print('task_func was canceled')
- raise
- return 'the result'
- def task_canceller(t):
- print('in task_canceller')
- t.cancel()
- print('canceled the task')
- async def main(loop):
- print('creating task')
- task = loop.create_task(task_func())
- loop.call_soon(task_canceller, task)
- try:
- await task
- except asyncio.CancelledError:
- print('main() also sees task as canceled')
- event_loop = asyncio.get_event_loop()
- try:
- event_loop.run_until_complete(main(event_loop))
- finally:
- event_loop.close()
捕捉异常会提供一个机会,如果必要,可以利用这个机会清理已经完成的工作。
1.5.3 从协程创建任务
ensure_future()函数返回一个与协程执行绑定的Task。这个Task实例再传递到其他代码,这个代码可以等待这个实例,而无须知道原来的协程是如何构造或调用的。
- import asyncio
- async def wrapped():
- print('wrapped')
- return 'result'
- async def inner(task):
- print('inner: starting')
- print('inner: waiting for {!r}'.format(task))
- result = await task
- print('inner: task returned {!r}'.format(result))
- async def starter():
- print('starter: creating task')
- task = asyncio.ensure_future(wrapped())
- print('starter: waiting for inner')
- await inner(task)
- print('starter: inner returned')
- event_loop = asyncio.get_event_loop()
- try:
- print('entering event loop')
- result = event_loop.run_until_complete(starter())
- finally:
- event_loop.close()
需要说明,对于提供给ensure_future()的协程,在使用await之前这个协程不会启动,只有await才会让它执行。
1.6 组合协程和控制结构
一系列协程之间的线性控制流用内置关键字await可以很容易地管理。更复杂的结构可能允许一个协程等待多个其他协程并行完成,可以使用asyncio中的工具创建这些更复杂的结构。
1.6.1 等待多个协程
通常可以把一个操作划分为多个部分,然后分别执行,这会很有用。例如,采用这种方法,可以高效地下载多个远程资源或者查询远程API。有些情况下,执行顺序并不重要,而且可能有任意多个操作,可以使用wait()暂停一个协程,直到其他后台操作完成。
- import asyncio
- async def phase(i):
- print('in phase {}'.format(i))
- await asyncio.sleep(0.1 * i)
- print('done with phase {}'.format(i))
- return 'phase {} result'.format(i)
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式