2015-03-27 16 views
9

asyncio ve güzel aiohttp kullanıyorum. Ana fikir, sunucuya istekte bulunmam (bağlantılar döndürüyor) ve daha sonra paralel (example'da olduğu gibi) tüm bağlantılardan dosyaları indirmek istiyorum.Neden Python asyncio'da "Görev yıkıldı, ancak beklemede" hatası alıyorum?

Kodu:

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()) 

Ama bunu çalıştırmayı denediğinizde, ben çok "İndir ..." çıkışları ve 'OK + dosya' hakkında

Task was destroyed but it is pending! 

Ve hiçbir şey.

Bunu nasıl düzeltebilirim?

cevap

11

yield fromasyncio.wait numaralı telefonu aramayı unutmuşsunuzdur. Muhtemelen bunun üzerinde yanlış bir girinti var; Sadece raw['files'] listesinin tamamını tekrarladıktan sonra çalıştırmak istersiniz. İşte her iki hatalar sabit komple örnek:

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()) 

yield from çağrısına olmadan, bitmemiş bir sürü neden senaryonuz çıkar anlamına gelecektir ki, dosyaların tamamı listeye iterated hemen sonra run çıkışlar downloader yok edilecek görevler ve görüntülenmesini istediğiniz uyarı.

+0

Hoş cevap için çok teşekkürler – tim

İlgili konular