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