将 aiohttp 请求与其响应相关联

Posted

技术标签:

【中文标题】将 aiohttp 请求与其响应相关联【英文标题】:Associating aiohttp requests with their responses 【发布时间】:2016-04-27 14:53:39 【问题描述】:

非常简单,我只想将来自 aiohttp 异步 HTTP 请求的响应与标识符(例如字典键)相关联,以便我知道哪个响应对应于哪个请求。

例如,下面的函数调用以字典值123 为后缀的URI。如何修改它以返回与每个结果关联的键?我只需要能够跟踪哪个请求是哪个……对于熟悉asyncio的人来说无疑是微不足道的@

import asyncio
import aiohttp

items = 'a': '1', 'b': '2', 'c': '3'

def async_requests(items):
    async def fetch(item):
        url = 'http://jsonplaceholder.typicode.com/posts/'
        async with aiohttp.ClientSession() as session:
            async with session.get(url + item) as response:
                return await response.json()

    async def run(loop):
        tasks = []
        for k, v in items.items():
            task = asyncio.ensure_future(fetch(v))
            tasks.append(task)
        responses = await asyncio.gather(*tasks)
        print(responses)

    loop = asyncio.get_event_loop()
    future = asyncio.ensure_future(run(loop))
    loop.run_until_complete(future)

async_requests(items)

输出(缩写):

['id': 2, ..., 'id': 3, ..., 'id': 1...]

期望的输出(例如):

'b': 'id': 2, ..., 'c': 'id': 3, ..., 'a': 'id': 1, ...

【问题讨论】:

【参考方案1】:

将密钥传递给fetch(),以将它们与相应的响应一起返回:

#!/usr/bin/env python
import asyncio
import aiohttp  # $ pip install aiohttp

async def fetch(session, key, item, base_url='http://example.com/posts/'):
    async with session.get(base_url + item) as response:
        return key, await response.json()

async def main():
    d = 'a': '1', 'b': '2', 'c': '3'
    with aiohttp.ClientSession() as session:
        ####tasks = map(functools.partial(fetch, session), *zip(*d.items()))
        tasks = [fetch(session, *item) for item in d.items()]
        responses = await asyncio.gather(*tasks)
    print(dict(responses))

asyncio.get_event_loop().run_until_complete(main())

【讨论】:

谢谢,这正是我所追求的。我注意到您在main() 中打开ClientSession() 而不是fetch() – 这仅仅是偏好问题吗? @bedeabc 一个更好的问题,为什么您需要在这里进行多个会话? @j-f-sebastian 谢谢,我明白你的意思了。我正在使用以下文章中的模式:pawelmhm.github.io/asyncio/python/aiohttp/2016/04/22/… @j-f-sebastian 嗨,你介意看看这个吗? ***.com/questions/37901292/…

以上是关于将 aiohttp 请求与其响应相关联的主要内容,如果未能解决你的问题,请参考以下文章

将列表元素与其索引相关联的pythonic方法

如何将 WAVE_MAPPER 音频线与其音频设备相关联

aiohttp初识(请求&响应)

Python asyncio/aiohttp:ValueError:Windows 上 select() 中的文件描述符过多

即使使用 asyncio 和 aiohttp,方法也会等待请求响应

aiohttp 异步http请求-11.ClientResponse 获取响应headers 和cookies