Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimanakah saya boleh mengoptimumkan penghantaran permintaan HTTP untuk 100,000 URL dalam Python 2.6?

Bagaimanakah saya boleh mengoptimumkan penghantaran permintaan HTTP untuk 100,000 URL dalam Python 2.6?

Susan Sarandon
Susan Sarandonasal
2024-11-17 16:27:021019semak imbas

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

Mengoptimumkan Penghantaran Permintaan HTTP dalam Python

Mengendalikan permintaan HTTP berskala besar boleh menimbulkan cabaran dalam Python, terutamanya untuk tugas yang melibatkan beribu-ribu URL . Artikel ini meneroka penyelesaian yang sangat cekap untuk menghantar 100,000 permintaan HTTP dalam Python 2.6, memanfaatkan konkurensi dan penjalinan untuk memaksimumkan prestasi.

Penyelesaian Tanpa Twisted:

Coretan kod berikut menyediakan kaedah yang pantas dan berkesan untuk menghantar permintaan HTTP secara serentak:

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)

Penjelasan:

  • Kolam benang dibuat dengan tahap konkurensi yang boleh dikonfigurasikan (dalam kes ini, 200).
  • Setiap urutan dalam kumpulan melaksanakan fungsi doWork, yang mengambil URL daripada baris gilir dan menghantar permintaan HTTP HEAD untuk mendapatkan kod status.
  • Hasilnya diproses dalam fungsi doSomethingWithResult, yang boleh disesuaikan untuk log atau melakukan operasi lain berdasarkan respons.
  • Baris gilir memastikan tugas diagihkan sama rata antara utas, meminimumkan perbalahan dan meningkatkan daya pengeluaran.

Pendekatan ini telah terbukti lebih pantas daripada penyelesaian berasaskan Twisted sambil juga mengurangkan penggunaan CPU. Ia menyediakan cara yang sangat cekap dan boleh dipercayai untuk mengendalikan permintaan HTTP berskala besar dalam Python 2.6.

Atas ialah kandungan terperinci Bagaimanakah saya boleh mengoptimumkan penghantaran permintaan HTTP untuk 100,000 URL dalam Python 2.6?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn