REST Web サービスに対して多くの URL リクエストを作成したいと考えています。通常は 75 ~ 90k です。ただし、Web サービスへの同時接続数を調整する必要があります。
私は次の方法で grequest をいじり始めましたが、すぐに開いたソケットを噛み始めました。
concurrent_limit = 30
urllist = buildUrls()
hdrs = {'Host' : 'hostserver'}
g_requests = (grequests.get(url, headers=hdrs) for url in urls)
g_responses = grequests.map(g_requests, size=concurrent_limit)
これが 1 分ほど実行されると、「ソケットの最大数に達しました」というエラーが発生します。私が知る限り、grequests の requests.get 呼び出しのそれぞれが独自のセッションを使用します。つまり、リクエストごとに新しいソケットが開かれます。
単一のセッションを使用して grequests を作成する方法について言及しているgithubに関するメモを見つけました。しかし、これは事実上、すべてのリクエストを単一の共有プールにボトルネックにしているようです。これは、非同期の http リクエストの目的を無効にしているようです。
s = requests.session()
rs = [grequests.get(url, session=s) for url in urls]
grequests.map(rs)
多くのセッションを作成する方法で grequests または gevent.Pool を使用することは可能ですか?
別の言い方をすれば、キューイングまたは接続プーリングのいずれかを使用して、多くの同時 HTTP リクエストを作成するにはどうすればよいですか?