2016-04-27 4 views
3

Sehr einfach möchte ich einfach Antworten von aiohttp asynchronen HTTP-Anfragen mit einem Bezeichner, z. B. einem Diktatschlüssel, zuordnen, so dass ich weiß, welche Antwort welcher Anfrage entspricht.Associate aiohttp Anfragen mit ihren Antworten

Zum Beispiel ruft die folgende Funktion URIs auf, denen die dict-Werte 1, 2 und 3 vorangestellt sind. Wie kann es geändert werden, um die mit jedem Ergebnis verknüpften Schlüssel zurückzugeben? Ich muß nur in der Lage sein, den Überblick behalten, welche Anforderung ist die ... Ohne Zweifel trivial für jemanden vertraut mit 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) 

Ausgang (abgekürzt):

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

gewünschte Ausgabe (zum Beispiel):

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

Antwort

3

Pass Tasten fetch(), sie mit der entsprechenden Antwort auf das Rück:

#!/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

Danke, das ist genau das, was ich suchte. Ich bemerke, dass Sie die 'ClientSession()' innerhalb von 'main()' öffnen anstatt die 'fetch()' - ist das nur eine Frage der Präferenz? –

+1

@bedeabc eine bessere Frage, warum brauchen Sie mehrere Sitzungen hier? – jfs

+0

@ j-f-sebastian Danke, ich verstehe deinen Standpunkt. Ich war Muster aus dem folgenden Artikel mit: http://pawelmhm.github.io/asyncio/python/aiohttp/2016/04/22/asyncio-aiohttp.html –

Verwandte Themen