我有一系列异步请求,其中一对异步请求包含请求A和请求B。此外,请求B依赖于请求A。换句话说,我需要将数据从响应A传递到请求B。因此,我需要安排任务,以便每个任务都发送请求A,然后仅在响应A返回之后才发送请求B。
from aiohttp import ClientSession
from typing import *
import asyncio
async def request_A(url: str,session: ClientSession) -> dict:
async with session.request('get',url) as response:
return await response.json()
async def request_B(url: str,data: dict,session: ClientSession) -> dict:
async with session.request('post',url,json=data) as response:
return await response.json()
async def request_chain(url_A: str,url_B: str,session: ClientSession) -> dict:
response_A_data = await request_A(url_A,session)
response_B_data = await request_B(url_B,response_A_data,session)
return response_B_data
async def schedule(url_chains: List[Tuple[str,str]]) -> list:
tasks = []
async with ClientSession() as session:
for url_chain in url_chains:
url_A,url_B = url_chain
task = asyncio.create_task(request_chain(url_A,url_B,session))
tasks.append(task)
return await asyncio.gather(*tasks)
def run_tasks(url_chains: List[Tuple[str,str]]) -> list:
return asyncio.run(schedule(url_chains))
现在,我的问题是:每个由一对请求组成的任务是否都能保证请求A在发送请求B之前返回?请解释。我担心在任务中,在等待请求A的同时,请求B可能会执行。
如果没有,如何使任务保持异步和非阻塞状态,又如何确保任务A中的请求A阻塞请求B的执行,直到响应A返回?
我了解我可以成批运行所有请求A调用,然后成批运行所有请求B调用,但是由于特定于我的用例,我需要运行全部(请求A,请求B )对。