Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 将aiohttp请求与其响应关联_Python 3.x_Python Requests_Python Asyncio_Aiohttp - Fatal编程技术网

Python 3.x 将aiohttp请求与其响应关联

Python 3.x 将aiohttp请求与其响应关联,python-3.x,python-requests,python-asyncio,aiohttp,Python 3.x,Python Requests,Python Asyncio,Aiohttp,非常简单,我只想将来自aiohttp异步HTTP请求的响应与标识符(如口述键)关联起来,以便知道哪个响应对应于哪个请求 例如,下面的函数调用以dict值1、2和3为后缀的URI。如何修改它以返回与每个结果关联的键?我只需要能够跟踪哪个请求是哪个请求……对于熟悉asyncio import asyncio import aiohttp items = {'a': '1', 'b': '2', 'c': '3'} def async_requests(items): async def

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

例如,下面的函数调用以dict值
1
2
3
为后缀的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)
输出(缩写):

期望输出(例如):

将键传递给
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()
——这只是一个偏好问题吗?@bediabc一个更好的问题,为什么您需要在这里多个会话?@j-f-sebastian谢谢,我明白您的意思。我使用的是以下文章中的模式:@j-f-sebastian嗨,你介意看看这个吗?
{'b': {'id': 2, ...}, 'c': {'id': 3, ...}, 'a': {'id': 1, ...}}
#!/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())