0

我想使用 HTTPX(在 FastAPI 中,如果重要的话)向外部 API 发出异步 http 请求,并将响应存储为单独的变量,以便根据获取的 URL 以稍微不同的方式进行处理。我正在修改StackOverflow 答案中的代码。

import asyncio
import httpx

async def perform_request(client, url):
    response = await client.get(url)
    return response.text

async def gather_tasks(*urls):
    async with httpx.AsyncClient() as client:
        tasks = [perform_request(client, url) for url in urls]
        result = await asyncio.gather(*tasks)
        return result

async def f():
    url1 = "https://api.com/object=562"
    url2 = "https://api.com/object=383"
    url3 = "https://api.com/object=167"
    url4 = "https://api.com/object=884"
    result = await gather_tasks(url1, url2, url3, url4)
    # print(result[0])
    # print(result[1])
    # DO THINGS WITH url2, SOMETHING ELSE WITH url4, ETC.

if __name__ == '__main__':
    asyncio.run(f())

访问个人回复的最佳方式是什么?(如果我使用 result[n] 我不知道我正在使用哪个响应。)

而且我对 httpx 和一般的异步操作还很陌生,所以如果您对如何以更好的方式实现它有任何建议,请分享。

4

1 回答 1

0

不管 AsyncIO 是什么,我可能会将逻辑放在gather_tasks. 在那里你知道响应,你可以定义if else你想要继续正确路径的所有逻辑。

在我看来,你有两个选择:


1 - 立即处理请求

在这种情况下f,只会初始化 url 并触发处理,其他一切都会发生在gather_tasks.

2 - “丰富”响应

您可以了解下一步要执行哪种操作,gather_tasks并将某种代码“附加”到响应中来定义它。例如,您可以返回一个带有两个键的 dict:响应和操作。这将是最明确的方式,但您也可以使用列表或元组,您只需要知道响应和“下一步代码”在其中的位置。

如果必须稍后而不是立即进行进一步处理,这将很有用。


说得通?

于 2021-01-08T13:21:53.710 回答