Ein guter Ansatz zur Lösung dieses Problems besteht darin, zuerst den Code zu schreiben, der erforderlich ist, um ein Ergebnis zu erhalten, und dann Threading-Code zu integrieren, um die Anwendung zu parallelisieren.
In einer perfekten Welt würde dies einfach bedeuten, gleichzeitig 100.000 Threads zu starten, die ihre Ergebnisse zur späteren Verarbeitung in ein Wörterbuch oder eine Liste ausgeben. In der Praxis ist die Anzahl der parallelen HTTP-Anforderungen, die Sie auf diese Weise ausgeben können, jedoch begrenzt. Lokal haben Sie Grenzen, wie viele Sockets Sie gleichzeitig öffnen können und wie viele Ausführungsthreads Ihr Python-Interpreter zulässt. Aus der Ferne kann die Anzahl der gleichzeitigen Verbindungen begrenzt sein, wenn alle Anforderungen an einen oder mehrere Server gerichtet sind. Diese Einschränkungen erfordern wahrscheinlich, dass Sie das Skript so schreiben, dass jeweils nur ein kleiner Teil der URLs abgefragt wird (100, wie in einem anderen Poster erwähnt, sind wahrscheinlich eine anständige Größe des Thread-Pools, obwohl Sie dies möglicherweise feststellen kann erfolgreich viele weitere bereitstellen).
Sie können diesem Entwurfsmuster folgen, um das obige Problem zu beheben:
- Starten Sie einen Thread, der neue Anforderungsthreads startet, bis die Anzahl der aktuell ausgeführten Threads (Sie können sie über threading.active_count () oder durch Verschieben der Threadobjekte in eine Datenstruktur verfolgen)> = Ihre maximale Anzahl gleichzeitiger Anforderungen ist (z. B. 100). , schläft dann für eine kurze Auszeit. Dieser Thread sollte beendet werden, wenn keine URLs mehr verarbeitet werden müssen. Auf diese Weise wacht der Thread weiter auf, startet neue Threads und schläft, bis Sie fertig sind.
- Lassen Sie die Anforderungsthreads ihre Ergebnisse in einer Datenstruktur speichern, um sie später abzurufen und auszugeben. Wenn die Struktur, in der Sie die Ergebnisse speichern, a
list
oder dict
in CPython ist, können Sie eindeutige Elemente ohne Sperren sicher an Ihre Threads anhängen oder einfügen. Wenn Sie jedoch in eine Datei schreiben oder eine komplexere threadübergreifende Dateninteraktion benötigen , sollten Sie a verwenden gegenseitige Ausschlusssperre zum Schutz dieses Staates vor Korruption .
Ich würde vorschlagen, dass Sie das Threading verwenden Modul verwenden. Sie können es verwenden, um laufende Threads zu starten und zu verfolgen. Die Threading-Unterstützung von Python ist kahl, aber die Beschreibung Ihres Problems legt nahe, dass sie für Ihre Anforderungen völlig ausreichend ist.
Wenn Sie würde schließlich wie eine ziemlich einfache Anwendung eines parallelen Netzwerk - Anwendung in Python geschrieben sehen, die ssh.py . Es ist eine kleine Bibliothek, die Python-Threading verwendet, um viele SSH-Verbindungen zu parallelisieren. Das Design ist nah genug an Ihren Anforderungen, sodass Sie es möglicherweise als gute Ressource ansehen.