2014年4月4日金曜日

aiohttpを使ってダウンロードする

aiohttpライブラリを使って複数のサイトを並列ダウンロードする。

import asyncio
import aiohttp

@asyncio.coroutine
def download(url):
    response = yield from aiohttp.request('GET', url)
    return (yield from response.read_and_close())

urls = ['http://www.yahoo.co.jp', 'http://www.google.co.jp']
loop = asyncio.get_event_loop()
f = asyncio.wait([download(u) for u in urls])
r = loop.run_until_complete(f)
for i in r[0]:
    print(i.result())

asyncio.waitは複数のコルーチンを1つのFutureにまとめる
asyncio.waitの戻り値は(done, pendding)のタプル
future.doneがTrueの場合はdoneにfutureが格納される。
run_until_completeは引数futureの戻り値(future.result())
なのでr[0]には処理が完了したfutureが格納されており、そのリストのなかのfutureの結果にdownload関数の戻り値が格納されている

0 件のコメント:

コメントを投稿