【问题标题】:Associating aiohttp requests with their responses将 aiohttp 请求与其响应相关联
【发布时间】: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, ...}}

【问题讨论】:

    标签: python-3.x python-requests python-asyncio aiohttp


    【解决方案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())
    

    【讨论】:

    猜你喜欢
    • 2018-12-10
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 2017-01-28
    相关资源
    最近更新 更多