python并发运行协程 asyncio.gather 和 a

2020-07-02  本文已影响0人  程序里的小仙女
同步有序,异步无序

技巧:
几乎所有的异步框架都将异步编程模型简化:一次只允许处理一个事件。故而有关异步的讨论几乎都集中在了单线程内。

0.协程理解:
一份详细的asyncio入门教程
[进阶]-Python3 异步编程详解(史上最全篇)

Future
future是一个数据结构,表示还未完成的工作结果。事件循环可以监视Future对象是否完成。从而允许应用的一部分等待另一部分完成一些工作。Future
获取Futrue里的结果
future表示还没有完成的工作结果。事件循环可以通过监视一个future对象的状态来指示它已经完成。future对象有几个状态:

Task
task是Future的一个子类,它知道如何包装和管理一个协程的执行。任务所需的资源
可用时,事件循环会调度任务允许,并生成一个结果,从而可以由其他协程消费。

import asyncio
async def foo():
    print("这是一个协程")
if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    try:
        print("开始运行协程")
        coro = foo()
        print("进入事件循环")
        loop.run_until_complete(coro)
    finally:
        print("关闭事件循环")
        loop.close()

原文链接:https://blog.csdn.net/ronon77/article/details/84854402
————————————————


1.Aiohttp的ClientSession理解:

  1. 例子:
import asyncio
from asyncio import sleep

import aiohttp

async def get_page():
    async with aiohttp.ClientSession() as session:
        # async with session.get('https://www.baidu.com') as resp:
        async with session.get('https://blog.csdn.net/u014595019/article/details/52295642') as resp:
            print(resp.status)
            print(await resp.text())
            await session.close()

loop = asyncio.get_event_loop()
# 执行多个函数任务队列
tasks = [get_page(),sleep(5), get_page()]

# asyncio.wait 并发协程
loop.run_until_complete(asyncio.wait(tasks))

# asyncio.gather 并发协程
# loop.run_until_complete(asyncio.gather(tasks))


# 执行单个函数
# loop.run_until_complete(get_page())
loop.close()

在用asyncio.wait 执行时, tasks任务队列里的sleep(5),不会报错,会异步执行等待5秒,程序就自然结束运行,
在asyncio.gather 执行sleep(5),报错:

上一篇下一篇

猜你喜欢

热点阅读