Python

[Python] HTTPリクエストを並列処理(非同期)できるライブラリ GRequests

GRequestsのインストール

pip install grequests

注:GReqestsrequestsgevent を使っていますので、それらも一緒にインストールされます。
帰ってくるオブジェクトもrequestsのそれなので完璧です。

  • grequestsのリポジトリ
    https://github.com/kennethreitz/grequests

使ってみる

# coding: utf-8
import grequests
import urllib
import time

# 走査対象のURL一覧
urls = [
    'http://www.heroku.com',
    'http://tablib.org',
    'http://httpbin.org',
    'http://python-requests.org',
    'http://kennethreitz.com',
]

# 同期でのURLフェッチ
class O(urllib.FancyURLopener, object):
    version = 'alternative user-agent'
o = O()
def sync():
    for u in urls:
        conn = o.open(u)
        assert conn.getcode() == 200

# 非同期でのURLフェッチ
def async():
    rs = (grequests.get(u) for u in urls)
    g = grequests.imap(rs)
    for r in g:
        assert r.status_code == 200

# 時間計測関数
def measure(fn):
    s = time.time()
    fn()
    e = time.time()
    return e-s

# 10回、何倍速くなるか計測(初回3回は無視)
print 'sync(sec)\tasync(sec)\tsync/async'
for n in range(13):
    if n >= 3:
        s = measure(sync)
        a = measure(async)
        print '%.2f\t%.2f\t%.2f' % (s, a, s/a)
$ python g.py 
sync(sec)       async(sec)      sync/async
2.47    1.86    1.32
2.53    1.90    1.33
2.55    1.96    1.30
2.52    1.85    1.36
2.52    2.00    1.26
2.57    1.83    1.40
2.62    1.99    1.32
2.70    1.98    1.36
2.50    1.80    1.39
2.56    1.85    1.38

参考


http://d.hatena.ne.jp/yatt/20121017/1350480131

コメントを残す