我支持suggestion above 使用HTTPX,但我经常以不同的方式使用它,所以添加我的答案。
我个人使用asyncio.run(introduced in Python 3.7)而不是asyncio.gather,也更喜欢aiostream的方式,可以结合asyncio和httpx使用。
就像我刚刚发布的this example 一样,这种样式有助于异步处理一组 URL,即使(常见)错误发生也是如此。我特别喜欢这种风格如何阐明响应处理发生的位置以及便于错误处理(我发现异步调用往往会提供更多)。
发布一个异步触发一堆请求的简单示例更容易,但通常您还想处理响应内容(用它计算一些东西,也许参考您请求的 URL 的原始对象做)。
该方法的核心如下:
async with httpx.AsyncClient(timeout=timeout) as session:
ws = stream.repeat(session)
xs = stream.zip(ws, stream.iterate(urls))
ys = stream.starmap(xs, fetch, ordered=False, task_limit=20)
process = partial(process_thing, things=things, pbar=pbar, verbose=verbose)
zs = stream.map(ys, process)
return await zs
地点:
-
process_thing 是一个异步响应内容处理函数
-
things 是输入列表(urls 的 URL 字符串生成器来自),例如对象/字典列表
-
pbar 是一个进度条(例如tqdm.tqdm)[可选但有用]
所有这些都在一个异步函数async_fetch_urlset 中,然后通过调用名为例如的同步“顶级”函数运行。 fetch_things 运行协程 [这是异步函数返回的内容] 并管理事件循环:
def fetch_things(urls, things, pbar=None, verbose=False):
return asyncio.run(async_fetch_urlset(urls, things, pbar, verbose))
由于可以就地修改作为输入传递的列表(这里是 things),因此您可以有效地取回输出(就像我们习惯于从同步函数调用中一样)