2015-03-27 20 views
9

Używam asyncio i pięknego aiohttp. Główną ideą jest to, że wysyłam żądanie do serwera (zwraca linki), a następnie chcę pobierać pliki ze wszystkich łączy w równolegle (coś jak w example).Dlaczego otrzymuję komunikat "Zadanie zostało zniszczone, ale oczekuje" w asynuencie Pythona?

Kod:

import aiohttp 
import asyncio 

@asyncio.coroutine 
def downloader(file): 
    print('Download', file['title']) 
    yield from asyncio.sleep(1.0) # some actions to download 
    print('OK', file['title']) 


def run(): 
    r = yield from aiohttp.request('get', 'my_url.com', True)) 
    raw = yield from r.json() 
    tasks = [] 
    for file in raw['files']: 
     tasks.append(asyncio.async(downloader(file))) 
     asyncio.wait(tasks) 

if __name__ == '__main__': 
    loop = asyncio.get_event_loop() 
    loop.run_until_complete(run()) 

Ale gdy próbuję go uruchomić, mam wiele "Pobierz ..." wyjścia i

Task was destroyed but it is pending! 

I nic o 'OK + nazwa pliku'.

Jak mogę to naprawić?

Odpowiedz

11

Zapomniałeś yield from połączenia z asyncio.wait. Prawdopodobnie masz również błędne wcięcie; chcesz go uruchomić dopiero po przejrzeniu całej listy raw['files']. Oto pełna przykładów z obu błędy naprawiono:

import aiohttp 
import asyncio 

@asyncio.coroutine 
def downloader(file): 
    print('Download', file['title']) 
    yield from asyncio.sleep(1.0) # some actions to download 
    print('OK', file['title']) 

@asyncio.coroutine 
def run(): 
    r = yield from aiohttp.request('get', 'my_url.com', True)) 
    raw = yield from r.json() 
    tasks = [] 
    for file in raw['files']: 
     tasks.append(asyncio.async(downloader(file))) 
    yield from asyncio.wait(tasks) 

if __name__ == '__main__': 
    loop = asyncio.get_event_loop() 
    loop.run_until_complete(run()) 

Bez wywołaniu yield from, run wyjścia natychmiast po tym, jak iterowane na całej listy plików, które będą oznaczać swoje wyjścia skryptu, powodując całą masę niedokończone downloader zadania do zniszczenia oraz ostrzeżenie, które zobaczyłeś.

+0

Wielkie dzięki za miłą odpowiedź – tim