2010-08-20 16 views
8

Mögliche Duplizieren:
How can I speed up fetching pages with urllib2 in python?Retrieve auf einmal mehrere URLs/parallel

ich ein Python-Skript, die Web-Seite herunterladen, analysieren sie und einen Wert von der Seite zurückzukehren. Ich brauche ein paar solcher Seiten, um das Endergebnis zu erhalten. Jeder Seitenabruf dauert lange (5-10s) und ich würde lieber parallel Anfragen stellen, um die Wartezeit zu verkürzen.
Die Frage ist - welcher Mechanismus wird es schnell, korrekt und mit minimaler CPU/Speicherverschwendung machen? Twisted, Asyncore, Threading, etwas anderes? Können Sie einen Link zu Beispielen bereitstellen?
Danke

UPD: Es gibt ein paar Lösungen für das Problem, ich bin auf der Suche nach dem Kompromiss zwischen Geschwindigkeit und Ressourcen. Wenn Sie einige Erfahrung Details erzählen könnten - wie es aus Ihrer Sicht schnell unter Last ist - wäre es sehr hilfreich.

+0

Siehe meine Antwort hier http://StackOverflow.com/Questions/3491455 –

Antwort

13

multiprocessing.Pool kann ein gutes Geschäft sein, gibt es some useful examples. Wenn Sie zum Beispiel eine Liste von URLs haben, können Sie den Inhalt Retrieval in einer gleichzeitigen Art und Weise abbilden:

def process_url(url): 
    # Do what you want 
    return what_you_want 

pool = multiprocessing.Pool(processes=4) # how much parallelism? 
pool.map(process_url, list_of_urls) 
+0

Nur als eine Warnung an alle anderen, ich bin mir nicht sicher, warum, aber innerhalb weniger Sekunden nach der Ausführung des Codes bringt es mein System zu einem vollständiger Halt. – Peter

+0

Ja, darüber. Einem System zu sagen, dass es 12 Bazillionen Dinge gleichzeitig tun könnte, könnte zu einer leichten Verzögerung bei der Verarbeitung anderer Aufgaben führen. LOL. –

3

multiprocessing

Spawn eine Reihe von Prozessen, eine für jede URL, die Sie herunterladen möchten. Verwenden Sie eine Queue, um eine Liste von URLs zu speichern und die Prozesse dazu zu bringen, eine URL aus der Warteschlange zu lesen, sie zu verarbeiten und einen Wert zurückzugeben.

1

einen asynchronen verwenden, das heißt ereignisgesteuert, anstatt zu blockieren, Rahmen für diese Vernetzung. Eine Option ist use twisted. Eine andere Option, die kürzlich verfügbar wurde, ist die Verwendung von Monokel. Dieses Mini-Framework versteckt die Komplexität nicht blockierender Operationen. Siehe this example. Es kann verdreht oder Tornado hinter den Kulissen verwenden, aber Sie bemerken nicht viel davon.