ホームページ  >  記事  >  バックエンド開発  >  Python 2.6 で 100,000 URL の HTTP リクエストのディスパッチを最適化するにはどうすればよいですか?

Python 2.6 で 100,000 URL の HTTP リクエストのディスパッチを最適化するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-17 16:27:02933ブラウズ

How can I optimize HTTP request dispatch for 100,000 URLs in Python 2.6?

Python での HTTP リクエスト ディスパッチの最適化

大規模な HTTP リクエストの処理は、特に数千の URL を含むタスクの場合、Python で課題となる可能性があります。 。この記事では、同時実行性とスレッド化を活用してパフォーマンスを最大化する、Python 2.6 で 100,000 の HTTP リクエストをディスパッチするための非常に効率的なソリューションについて説明します。

ツイストレス ソリューション:

次のコード スニペットは、次のコード スニペットを提供します。 HTTP リクエストを同時に送信するための高速かつ効果的な方法:

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)

説明:

  • スレッド プールは、構成可能な同時実行レベルで作成されます (この場合、200)。
  • プール内の各スレッドは doWork 関数を実行します。この関数はキューから URL をフェッチし、HTTP HEAD リクエストを送信してステータス コードを取得します。
  • 結果はdoSomethingWithResult 関数。応答に基づいてログを記録したり、他の操作を実行したりするようにカスタマイズできます。
  • キューにより、タスクがスレッド間で均等に分散され、競合が最小限に抑えられ、スループットが向上します。

このアプローチは、Twisted ベースのソリューションよりも高速であると同時に、CPU 使用率も削減されることが示されています。これは、Python 2.6 で大規模な HTTP リクエストを処理するための非常に効率的で信頼性の高い方法を提供します。

以上がPython 2.6 で 100,000 URL の HTTP リクエストのディスパッチを最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。