Python で 100,000 件の HTTP リクエストを送信する最も速い方法は何ですか? 質問する

Python で 100,000 件の HTTP リクエストを送信する最も速い方法は何ですか? 質問する

100,000 個の URL を含むファイルを開いています。各 URL に HTTP リクエストを送信し、ステータス コードを出力する必要があります。私は Python 2.6 を使用しており、これまで Python がスレッド/並行性を実装する多くの紛らわしい方法を見てきました。Python の同意ライブラリはありますが、このプログラムを正しく記述する方法がわかりません。同様の問題に遭遇した人はいますか? 一般的には、Python で何千ものタスクをできるだけ速く実行する方法を知る必要があると思います。つまり、「並行して」実行するということです。

ベストアンサー1

ねじれのないソリューション:

from urlparse import urlparse
from threading import Thread
import httplib, sys
from Queue import Queue

concurrent = 200

def doWork():
    while True:
        url = q.get()
        status, url = getStatus(url)
        doSomethingWithResult(status, url)
        q.task_done()

def getStatus(ourl):
    try:
        url = urlparse(ourl)
        conn = httplib.HTTPConnection(url.netloc)   
        conn.request("HEAD", url.path)
        res = conn.getresponse()
        return res.status, ourl
    except:
        return "error", ourl

def doSomethingWithResult(status, url):
    print status, url

q = Queue(concurrent * 2)
for i in range(concurrent):
    t = Thread(target=doWork)
    t.daemon = True
    t.start()
try:
    for url in open('urllist.txt'):
        q.put(url.strip())
    q.join()
except KeyboardInterrupt:
    sys.exit(1)

これは、ツイストされたソリューションよりもわずかに高速で、CPU の使用量が少なくなります。

おすすめ記事