7

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 リクエストを作成するにはどうすればよいですか?

4

3 に答える 3

7

私は自分の問題を解決するために grequests を使用しなくなりました。私はそれが可能かもしれないとまだ願っています。

私はスレッドを使用しました:

class MyAwesomeThread(Thread):
    """
    Threading wrapper to handle counting and processing of tasks
    """
    def __init__(self, session, q):
        self.q = q
        self.count = 0
        self.session = session
        self.response = None
        Thread.__init__(self)

    def run(self): 
        """TASK RUN BY THREADING"""
        while True:
            url, host = self.q.get()
            httpHeaders = {'Host' : host}
            self.response = session.get(url, headers=httpHeaders)
            # handle response here
            self.count+= 1
            self.q.task_done()
        return

q=Queue()
threads = []
for i in range(CONCURRENT):
    session = requests.session()
    t=MyAwesomeThread(session,q)
    t.daemon=True # allows us to send an interrupt 
    threads.append(t)


## build urls and add them to the Queue
for url in buildurls():
    q.put_nowait((url,host))

## start the threads
for t in threads:
    t.start()
于 2013-12-12T21:43:23.757 に答える
2

rs は AsyncRequest リストです。各 AsyncRequest には独自のセッションがあります。

rs = [grequests.get(url) for url in urls]
grequests.map(rs)
for ar in rs:
    print(ar.session.cookies)
于 2013-11-28T06:34:22.530 に答える