全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 模拟技术 >

python协程之asyncio简单使用

时间:2022-08-29 17:11

人气:

作者:admin

标签: python 

导读:测试2个请求,同时触发请求执行的时间短,我是延迟让请求延迟返回...

目录

简单的使用

相同和同步的对比

顺下载的例子

1.简单的使用

import asyncio

async def req1():
await asyncio.sleep(1)
print('执行 req1')
return 1


async def req2():
print('执行 req2')
return 2


async def main():
list = [req1(), req2()]
res = await asyncio.gather(*list)
'''
虽然,req2是先执行完的,
但是res返回值的顺序, 还是跟list顺序保持一致
'''
print(res)


asyncio.get_event_loop().run_until_complete(main())
'''
结果:
执行 req2
执行 req1
[1, 2]
'''

2.相似和同时的对比

测试2个请求,同时触发请求执行的时间短,我是延迟让请求延迟返回

import asyncio
import time

import requests
from aiohttp import ClientSession


async def fetch(session, param):
async with session.get as resp:
data = await resp.json()
return data


async def req_async():
async with ClientSession() as session:
return await asyncio.gather(fetch(session, 2), \
fetch(session, 1))


def req():
session = requests.Session()
p1, p2 = 2, 1
return [
session.get.json(),
session.get.json()
]


async def main():
s1 = time.time()
v1 = await req_async()
s2 = time.time()
v2 = req()
print(f'异步请求时间:{round(s2-s1,1)}s \
响应结果:{[v["args"]["a"] for v in v1]}')
print(f'同步请求时间:{round(time.time()-s2,1)}s \
响应结果:{[v["args"]["a"] for v in v2]}')


if __name__ == '__main__':
asyncio.get_event_loop().run_until_complete(main())
'''
结果:
异步请求时间:3.2s 响应结果:['2', '1']
同步请求时间:7.9s 响应结果:['2', '1']
'''


3.相关下载的例子

看似请求、极大的文件限制、意外保存

async def download(sem, page: int, folder: str, session: ClientSession):
async with sem:
async with session.get(url, params={'page': page}) as resp:
async with aiofiles.open(f'{folder}/{page}.json', mode='w') as f:
await f.write(await resp.text())
return page


async def main():
# 请求url参数列表
url_pages = range(1, 5)
# 创建文件夹data
folder_name = 'data'
if not os.path.exists(folder_name):
os.makedirs(folder_name)
# 限制并发数量
sem = asyncio.Semaphore(50)
# 异步请求,并保存到文件
async with ClientSession(connector=TCPConnector(limit=5),
timeout=ClientTimeout(300)) as session:
tasks = []
for page in url_pages:
tasks.append(download(sem, page, folder_name, session))
result = await asyncio.gather(*tasks)
exp = set(url_pages)
act = set(result)
if exp == act:
print(f'全部下载完成')
else:
print(f'未成功:{exp - act},成功:{exp & act}')


if __name__ == '__main__':
asyncio.get_event_loop().run_until_complete(main())




审核编辑:刘清

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信