python - 使用 asyncio 异步运行两个并发任务组
问题描述
我正在尝试使用asyncio
并面向此博客文章编写程序。我想要做的是同时获取一些 JSON 数据。对于一个输入数据帧。但是,我想在请求的数据可用后立即对其进行进一步处理。
所以基本上有两组任务:
- 同时处理 df1 中的数据,并在 JSON 返回后进行一些计算
- 同时处理 df2 中的数据
它们或多或少相互独立,但我也想同时运行这组任务。两个任务组完成后,我想进一步处理它们。
我的问题是,如果我的实现在asyncio
模式方面设计得当,我只使用了两个收集语句?或者这是否是错误的概念?这里有一个小插曲:
import asyncio
import aiohttp
from aiohttp import ClientSession
async def fetch_json(url: str, session: ClientSession, data: json.dumps) -> Dict:
resp = await session.get(url=url, headers={"content-type": "application/json"}, data=data)
resp.raise_for_status()
logger.info("Got response [%s] for URL: %s", resp.status, url)
json = await resp.json()
return json
async def some_calc(url: str, session: ClientSession, data: json.dumps):
res = await fetch_json(url=url, session=session, data=data)
return [float(x) for x in res]
async def process_data(df: Dict, url: str, session: ClientSession):
async with session:
tasks = []
for data in df:
try:
if df1:
task = some_calc(url=url, session=session, data=data)
else:
task = fetch_json(url=url, session=session, data=data)
except Exception as e:
# ...
tasks.append(
task
)
res = await asyncio.gather(*tasks)
return res
async def bulk_execute(df1, df2):
url = "http://some.url/"
async with ClientSession() as session:
res = await asyncio.gather(process_data(df1, url, session), process_data(df2, url, session))
return res
if __name__ == "__main__":
res = asyncio.run(bulk_execute(df1, df2))
解决方案
推荐阅读
- c - 如何让用户将点击处理函数绑定到按钮?
- c# - 如何强制 dll 在运行时可访问
- .htaccess - 从已删除的页面 htaccess 重定向
- javascript - 引导卡头 - 所有人的高度相同
- python - 我想获取以下格式的python列表
- python - 在 python 中创建 inode 时,`mode` 的每个字符是什么意思?
- python - 在 linux 中使用虚拟 venv 安装新的 python 版本
- java - 我见过人们在函数结束时使用 return -1 。它实际上是什么意思?
- python - ValueError:参数 U 的大小为 4,与 1 不匹配,即箭头位置的数量
- gams-math - 计算 MIP 问题 GAMS 中的相对最优性差距