python-asyncawait关键字与实战(asyncio,aiohttp库的使用)

Posted lady_killer9

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python-asyncawait关键字与实战(asyncio,aiohttp库的使用)相关的知识,希望对你有一定的参考价值。

目录


简介

进程和线程是计算机提供的,协程是程序员创造的,不存在于计算机中。
协程(Co-routine),也可称为微线程,或非抢占式的多任务子例程,一种用户态的上下文切换技术(通过一个线程实现代码块间的相互切换执行)在一个线程(协程)中,遇到io等待时间,线程可以利用这个等待时间去做其他事情。

关键字

async

定义函数时加上async修饰,即async def func(), 则该函数为协程函数,协程函数返回的对象即为协程对象。

await

与协程函数一起使用,协程函数调用时,前面不加await会显示以下内容

RuntimeWarning: coroutine ‘xxx’ was never awaited

await要在函数里面,否则会显示以下内容

‘await’ outside function

asyncio

asyncio 是用来编写 并发 代码的库,使用 async/await 语法。
asyncio 被用作多个提供高性能 Python 异步框架的基础,包括网络和网站服务,数据库连接库,分布式任务队列等等。
asyncio 往往是构建 IO 密集型和高层级 结构化 网络代码的最佳选择。

run

该函数用来运行最高层级的入口点,如下面的main函数

import asyncio
import time
async def async_test(delay:int,content):
    await asyncio.sleep(delay)
    print(content)

async def main():
    await async_test(1,"lady")
    await async_test(2,"killer9")


if __name__ == '__main__':
    print(f"start at time.strftime('%X')")
    asyncio.run(main())
    print(f"end at time.strftime('%X')")

结果如下:

start at 16:30:56
lady
killer9
end at 16:30:59

可以看到,等待了3秒

create_task

import asyncio
import time
async def async_test(delay:int,content):
    await asyncio.sleep(delay)
    print(content)

async def main():
    task_lady = asyncio.create_task(async_test(1,"lady"))
    task_killer = asyncio.create_task(async_test(2,"killer9"))
    await task_lady
    await task_killer

if __name__ == '__main__':
    print(f"start at time.strftime('%X')")
    asyncio.run(main())
    print(f"end at time.strftime('%X')")

结果如下:

start at 16:40:53
lady
killer9
end at 16:40:55

可以看到等待了2秒

wait

并发执行可等待对象

import asyncio
import time
async def async_test(delay:int,content):
    await asyncio.sleep(delay)
    print(content)

if __name__ == '__main__':
    print(f"start at time.strftime('%X')")
    asyncio.run(asyncio.wait([async_test(1,"lady"),async_test(2,"killer")]))
    print(f"end at time.strftime('%X')")

结果如下:

start at 17:30:41
lady
killer
end at 17:30:43

可以看到等待了2秒

aiohttp

aio-libs下的一个包,还有个mysql的也不错
在写爬虫的时候我们往往会并发爬取,例如,并发爬取小说的多个章节。这里就爬取文章100,来对比一下。

import aiohttp
import asyncio
import time
import requests

async def main():
    async with aiohttp.ClientSession() as session:
           async with session.get('https://blog.csdn.net/lady_killer9/article/details/108763489') as response:
                await response.text()

def get_normal():
    for i in range(100):
        resp = requests.get("https://blog.csdn.net/lady_killer9/article/details/108763489")
        if resp.text:
            continue

if __name__ == '__main__':
    print(f"started at time.strftime('%X')")
    get_normal()
    print(f"end at time.strftime('%X')")
    print(f"started at time.strftime('%X')")
    asyncio.run(asyncio.wait([main() for i in range(100)]))
    print(f"end at time.strftime('%X')")

结果如下:

started at 17:32:03
end at 17:32:08
started at 17:32:08
end at 17:32:09

可以看到请求网页100次,一个用了5秒,一个用了1秒

参考

协程与任务
github- aiohttp

以上是关于python-asyncawait关键字与实战(asyncio,aiohttp库的使用)的主要内容,如果未能解决你的问题,请参考以下文章

flutter实战:搭建登录页与朋友圈列表页

SQL实战新手入门:删除视图

日志服务Python消费组实战:实时跨域监测多日志库数据

Rust语言入门关键技术与实战经验

欢迎购买《Kafka源码解析与实战》

欢迎购买《Kafka源码解析与实战》