2016-04-27 4 views
3

Очень просто, я просто хотел бы связать ответы от aiohttp асинхронных HTTP-запросов с идентификатором, таких как ключ-запрос, чтобы я знал, какой ответ соответствует запросу.Связывание запросов aiohttp с их ответами

Например, нижеприведенная функция вызывает URI с суффиксными значениями 1, 2 и 3. Как его можно изменить, чтобы вернуть ключи, связанные с каждым результатом? Мне просто нужно, чтобы иметь возможность отслеживать, какой запрос, который ... Несомненным тривиальна для кого-то знакомого с 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) 

Output (сокращенном):

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

Желаемая вывода (например):

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

ответ

3

Пасс ключи к 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()) 
+0

Спасибо, это именно то, что я был после. Я замечаю, что вы открываете 'ClientSession()' inside 'main()', а не 'fetch()' - это просто вопрос предпочтения? –

+1

@bedeabc лучший вопрос, почему вам нужно несколько сеансов здесь? – jfs

+0

@ j-f-sebastian Спасибо, я вижу вашу мысль. Я использовал шаблоны из следующей статьи: http://pawelmhm.github.io/asyncio/python/aiohttp/2016/04/22/asyncio-aiohttp.html –