如何在Python3中实现多REST请求的异步调用
如何将同步REST请求改为asyncio异步调用?
原代码通过requests库同步发起10个POST请求创建分类,每次请求必须等待上一个响应返回后才会执行下一个。现在需要改用asyncio实现异步调用,需做以下核心修改:
关键修改点
- 替换HTTP库:
requests是同步库,无法适配asyncio异步模型,需改用aiohttp异步HTTP客户端库。 - 改造为异步函数:将原函数定义改为
async def,所有异步操作前添加await关键字。 - 批量并发任务:放弃逐个执行的for循环,将每个请求封装为异步任务,用
asyncio.gather()批量并发执行。 - 适配异步响应处理:使用
aiohttp.ClientSession管理异步会话,异步读取并解析响应内容。 - 调整调用逻辑:异步函数必须在asyncio事件循环中运行,通过
asyncio.run()(Python3.7+)启动。
修改后的完整代码
import asyncio import aiohttp import json import os import logging async def create_single_category(session, url, headers, category_payload): # 单个分类创建的异步任务 async with session.post(url, headers=headers, json=category_payload) as response: response_data = await response.json() print(response_data) category_id = response_data['id'] message = f'The entity with id: {category_id} is created successfully.' logging.info(message) return category_id async def createCategories(BACKEND_URL, token, category): url = os.path.join(BACKEND_URL, 'api/v1/category-creation') category_dict = read_payloads(category) headers = { "token": token, "Content-Type": "application/json", "accept": "application/json" } # 创建异步会话,统一管理连接 async with aiohttp.ClientSession() as session: # 生成所有异步任务 tasks = [ create_single_category(session, url, headers, payload) for name, payload in category_dict.items() ] # 并发执行所有任务,等待全部完成 await asyncio.gather(*tasks) return "categories created successfully." # 调用示例(需在事件循环中执行) if __name__ == "__main__": # 替换为实际参数 asyncio.run(createCategories("http://your-backend-url", "your-token", "your-category"))
额外注意事项
- 先安装依赖:
pip install aiohttp - 如果
read_payloads涉及文件读取等IO操作,建议改用aiofiles改成异步函数,避免阻塞事件循环。 logging模块在异步环境中可正常使用,本身具备线程/协程安全性。
内容的提问来源于stack exchange,提问作者azaveri7
相关产品推荐
相关产品推荐

