python爬虫-async
协程与任务
协程
1 | 协程 通过 async/await 语法进行声明,是编写 asyncio 应用的推荐方式 |
1 | 注意:简单地调用一个协程并不会使其被调度执行 |
三种主要机制
asyncio.run()
1 | 要真正运行一个协程,asyncio 提供了三种主要机制 |
1 | started at 17:13:52 |
asyncio.create_task()
1 | asyncio.create_task() 函数用来并发运行作为 asyncio 任务 的多个协程 |
1 | 注意,预期的输出显示代码段的运行时间比之前快了 1 秒: |
可被等待对象
1 | 如果一个对象可以在 await 语句中使用,那么它就是 可等待 对象。许多 asyncio API 都被设计为接受可等待对象。 |
协程
1 | Python 协程属于 可等待 对象,因此可以在其他协程中被等待 |
任务
1 | 任务 被用来“并行的”调度协程 |
1 | import asyncio |
Futures
1 | Future 是一种特殊的 低层级 可等待对象,表示一个异步操作的 最终结果。 |
1 | async def main(): |
1 | 一个很好的返回对象的低层级函数的示例是 loop.run_in_executor() |
运行asyncio程序
1 | asyncio.run(coro, *, debug=False) |
创建任务
1 | asyncio.create_task(coro, *, name=None) |
1 | async def coro(): |
休眠
1 | coroutine asyncio.sleep(delay, result=None) |
1 | 这个函数从 3.7 开始就会隐式地获取当前正在运行的事件循环 |
并发运行任务
1 | awaitable asyncio.gather(*aws, return_exceptions=False) |
1 | import asyncio |
1 | 注解 如果 return_exceptions 为 False,则在 gather() 被标记为已完成后取消它将不会取消任何已提交的可等待对象。 例如,在将一个异常传播给调用者之后,gather 可被标记为已完成,因此,在从 gather 捕获一个(由可等待对象所引发的)异常之后调用 gather.cancel() 将不会取消任何其他可等待对象 |
屏蔽取消操作
1 | awaitable asyncio.shield(aw) |
超时
1 | coroutine asyncio.wait_for(aw, timeout) |
1 | async def eternity(): |
简单等待
1 | coroutine asyncio.wait(aws, *, timeout=None, return_when=ALL_COMPLETED) |
1 | done, pending = await asyncio.wait(aws) |
1 | 与 wait_for() 不同,wait() 在超时发生时不会取消可等待对象 |
你给世界什么姿态,世界将还你什么样的人生。