首頁  >  文章  >  後端開發  >  如何在 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 請求可能會給Python 帶來挑戰,特別是對於涉及數千個URL 的任務。本文探討了一種在 Python 2.6 中調度 100,000 個 HTTP 請求的高效解決方案,利用並發和執行緒來最大限度地提高效能。

Twistedless 解決方案:

以下程式碼片段提供一個快速有效的同時發送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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn