13

1000 件を超えるリクエストを 1 つのページに同時に送信するスクリプトを作成しようとしています。ただし、スレッド (1000) スレッドでライブラリを要求します。最初の 50 件ほどのリクエストはすべて 1 秒以内に処理されているようですが、他の 9950 件のリクエストにはかなり時間がかかっています。こんな感じで測りました。

def print_to_cmd(strinng):
    queueLock.acquire()
    print strinng
    queueLock.release()

    start = time.time()
    resp = requests.get('http://test.net/', headers=header)
    end = time.time()

    print_to_cmd(str(end-start))

リクエスト ライブラリが、リクエストの送信速度を制限していると考えています。

Pythonでリクエストを同時に送信する方法を知っている人はいますか? 私は200MBのアップロードを備えたVPSを持っているので、それは問題ではなく、pythonやリクエストライブラリがそれを制限していることと関係があります。それらはすべて、互いに 1 秒以内に Web サイトにアクセスする必要があります。

読んでくれてありがとう。誰かが助けてくれることを願っています。

4

3 に答える 3

28

一般的に、tornado のような非同期ライブラリを使用することが最善の解決策であることがわかりました。ただし、私が見つけた最も簡単な解決策は、ThreadPoolExecutor を使用することです。


import requests
from concurrent.futures import ThreadPoolExecutor

def get_url(url):
    return requests.get(url)
with ThreadPoolExecutor(max_workers=50) as pool:
    print(list(pool.map(get_url,list_of_urls)))
于 2016-11-03T00:37:34.903 に答える
1

自分が何をしているのかを知っていると仮定して、最初にジッターを使用してバックオフ ポリシーを実装し、サーバーへの「予測可能な雷鳴」を防ぐことをお勧めします。とはいえ、いくつかのことを検討する必要がありますthreading

import threading
class FuncThread(threading.Thread):
    def __init__(self, target, *args):
        self._target = target
        self._args = args
        threading.Thread.__init__(self)

    def run(self):
        self._target(*self._args)

あなたが何かをするように

t = FuncThread(doApiCall, url)
t.start()

メソッド doApiCall は次のように定義されています

def doApiCall(self, url):
于 2016-11-03T00:25:34.013 に答える