Ich habe eine Datei mit 100.000 URLs, die ich anfragen und dann verarbeiten muss. Die Verarbeitung benötigt eine nicht zu vernachlässigende Zeit im Vergleich zu der Anfrage, so dass die Verwendung von Multithreading nur eine teilweise Beschleunigung bringt. Von dem, was ich gelesen habe, denke ich, dass die Verwendung des Moduls multiprocessing
oder etwas Ähnliches eine substantielle Beschleunigung bieten würde, da ich mehrere Kerne verwenden könnte. Ich vermute, ich möchte einige Prozesse mit mehreren Threads verwenden, aber ich bin mir nicht sicher, wie das geht.Schnellste Möglichkeit zum Lesen und Verarbeiten von 100.000 URLs in Python
Hier ist mein aktueller Code, Gewindeschneiden mit (basierend auf What is the fastest way to send 100,000 HTTP requests in Python?):
from threading import Thread
from Queue import Queue
import requests
from bs4 import BeautifulSoup
import sys
concurrent = 100
def worker():
while True:
url = q.get()
html = get_html(url)
process_html(html)
q.task_done()
def get_html(url):
try:
html = requests.get(url, timeout=5, headers={'Connection':'close'}).text
return html
except:
print "error", url
return None
def process_html(html):
if html == None:
return
soup = BeautifulSoup(html)
text = soup.get_text()
# do some more processing
# write the text to a file
q = Queue(concurrent * 2)
for i in range(concurrent):
t = Thread(target=worker)
t.daemon = True
t.start()
try:
for url in open('text.txt'):
q.put(url.strip())
q.join()
except KeyboardInterrupt:
sys.exit(1)
. @ Gus Sie werden nicht beschleunigen mit der gleichzeitigen Verwendung von 100. Sie alle gehen zur gleichen Zeit, und Überraschung - sie alle kommen wieder warten auf OS-Prozesse. Was Sie tun könnten, ist zwei Schritte. Ziehen Sie alles mit lokalem Threading (i/o) und multi-process mit Kernen * 2. (oder, Sie werden das gleiche Problem haben) – Merlin
Ich sehe. Vielleicht könnte ich es in zwei Skripte aufteilen - ein Skript, das nur Multithreading verwendet, und das rohe HTML in Dateien speichern. Dann haben Sie ein anderes, das multiprocessing ist, die Akten bearbeitend und sie dann löschend, wenn Sie getan werden. Nicht sicher, ob dies die beste Lösung ist? – Gus
Das würde ich tun. -- und TU. --- Sonst könnten Sie Sprachen wechseln und nodejs verwenden, um zu kratzen - aber das ist ein ganz anderer Prozess. – Merlin