0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

python协程之asyncio简单使用

冬至配饺子 来源:缪斯之子 作者:肖新苗 2022-08-29 17:11 次阅读

目录

简单的使用

相同和同步的对比

下载的例子

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())




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • python
    +关注

    关注

    56

    文章

    4784

    浏览量

    84497
收藏 人收藏

    评论

    相关推荐

    使用Python进行串口通信的案例

    当然!以下是一个使用Python进行串口通信的简单示例。这个示例展示了如何配置串口、发送数据以及接收数据。我们将使用 pyserial 库,这是一个非常流行的用于串口通信的Python库。 首先,你
    的头像 发表于 11-22 09:11 98次阅读

    使用TMS320C6416处理器:Turbo处理器(TCP)

    电子发烧友网站提供《使用TMS320C6416处理器:Turbo处理器(TCP).pdf》资料免费下载
    发表于 10-23 10:16 0次下载
    使用TMS320C6416<b class='flag-5'>协</b>处理器:Turbo<b class='flag-5'>协</b>处理器(TCP)

    使用TMS320C6416处理器:Viterbi处理器(VCP)

    电子发烧友网站提供《使用TMS320C6416处理器:Viterbi处理器(VCP).pdf》资料免费下载
    发表于 10-21 09:36 0次下载
    使用TMS320C6416<b class='flag-5'>协</b>处理器:Viterbi<b class='flag-5'>协</b>处理器(VCP)

    第二届大会回顾第25期 | OpenHarmony上的Python设备应用开发

    Python以其简单、易学和功能强大而闻名,有着广泛的用户群体。采用Python开发有助于降低OpenHarmony的学习门槛。如何在OpenHarmony上用Python开发设备应用
    的头像 发表于 08-27 11:53 650次阅读
    第二届大会回顾第25期 | OpenHarmony上的<b class='flag-5'>Python</b>设备应用开发

    pytorch和python的关系是什么

    在当今的人工智能领域,Python已经成为了最受欢迎的编程语言之一。Python的易学易用、丰富的库和框架以及强大的社区支持,使其成为了数据科学、机器学习和深度学习等领域的首选语言。而在深度学习领域
    的头像 发表于 08-01 15:27 1761次阅读

    opencv-python和opencv一样吗

    不一样。OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,它提供了大量的图像和视频处理功能。OpenCV-Python
    的头像 发表于 07-16 10:38 1047次阅读

    用pycharm进行python爬虫的步骤

    以下是使用PyCharm进行Python爬虫的步骤: 安装PyCharm和Python 首先,您需要安装PyCharm和Python。PyCharm是一个流行的Python集成开发环境
    的头像 发表于 07-11 10:11 761次阅读

    tensorflow简单的模型训练

    TensorFlow开始,然后介绍如何构建和训练一个简单的神经网络模型。 1. 安装TensorFlow 首先,我们需要安装TensorFlow。TensorFlow支持多种编程语言,包括Python、C++
    的头像 发表于 07-05 09:38 535次阅读

    Python:从串口读取数据并以16进制格式展示

    本文凌顺实验室(lingshunlab.com)简单实现Python读取串口数据,并且按16进制格式显示出来。
    的头像 发表于 03-05 14:25 1032次阅读
    <b class='flag-5'>Python</b>:从串口读取数据并以16进制格式展示

    基于Python的地图绘制教程

    本文将介绍通过Python绘制地形图的方法,所需第三方Python相关模块包括 rasterio、geopandas、cartopy 等,可通过 pip 等方式安装。
    的头像 发表于 02-26 09:53 1131次阅读
    基于<b class='flag-5'>Python</b>的地图绘制教程

    鸿蒙轻内核源码分析:MMU 处理器

    1、 ARM C15 处理器 在 ARM 嵌入式应用系统中, 很多系统控制由 ARM CP15 处理器来完成的。CP15 处理器包含编号 0-15 的 16 个 32 位的寄存器。例如,ARM
    的头像 发表于 02-20 14:28 542次阅读
    鸿蒙轻内核源码分析:MMU <b class='flag-5'>协</b>处理器

    如何使用linux下gdb来调试python程序

    如何使用linux下gdb来调试python程序  在Linux下,可以使用GDB(GNU调试器)来调试Python程序。GDB是一个强大的调试工具,可以帮助开发者诊断和修复程序中的错误。在本文
    的头像 发表于 01-31 10:41 2453次阅读

    谈谈程的那些事儿

    随着异步编程的发展以及各种并发框架的普及,程作为一种异步编程规范在各类语言中地位逐步提高。我们不单单会在自己的程序中使用程,各类框架如fastapi,aiohttp等也都是基于异步以及程进行实现。那到底什么是
    的头像 发表于 01-26 11:36 1097次阅读
    谈谈<b class='flag-5'>协</b>程的那些事儿

    BlueNRG系列处理器实战经验简介

    BlueNRG 系列芯片从最早的一代 BlueNRG-MS 开始就支持处理器模式。
    的头像 发表于 01-05 18:16 1811次阅读
    BlueNRG系列<b class='flag-5'>协</b>处理器实战经验简介

    split在python中的用法

    split()函数的用法,以及一些实际应用场景。 1. split()的基本用法 split()函数的基本用法非常简单,只需要在字符串上直接调用即可。例如: ``` str = "Python is a
    的头像 发表于 12-25 15:12 1979次阅读