2009-07-20 2 views
0

Ich habe eine tkinter GUI, die Daten von mehreren Websites gleichzeitig herunterlädt. Ich führe einen separaten Thread für jeden Download (ca. 28). Sind das zu viele Threads für einen GUI-Prozess? Da es sehr langsam ist, sollte jede einzelne Seite ungefähr 1 bis 2 Sekunden dauern, aber wenn alle gleichzeitig ausgeführt werden, dauert es mehr als 40 Sekunden. Gibt es eine Möglichkeit, die Zeit für das Herunterladen aller Seiten zu verkürzen? Jede Hilfe wird geschätzt, danke.Python Zugriff auf mehrere Webseiten gleichzeitig

Antwort

2

Es ist wahrscheinlich die GIL (Global Interpreter Lock), die Ihnen im Weg steht. Python hat einige Leistungsprobleme mit vielen Threads.

Sie könnten versuchen twisted.web.getPage (siehe http://twistedmatrix.com/projects/core/documentation/howto/async.html ein wenig auf der Seite). Ich habe keine Benchmarks dafür. Aber das Beispiel auf dieser Seite und das Hinzufügen von 28 verzögerten, um zu sehen, wie schnell es ist, wird Ihnen ein vergleichbares Ergebnis ziemlich schnell geben. Denken Sie daran, dass Sie den GTK-Reaktor verwenden müssen und in den Programmierungsstil Twists kommen müssen.

+0

Ich bezweifle es: das ist, warum TCP-Sockets gepuffert werden. Ich werde es aus Neugier ausprobieren müssen, aber ich würde erwarten, dass das Sockelpuffering das zum größten Teil übernimmt. –

+0

Ich lese diese Seite durch und es sieht ziemlich nützlich aus, ich könnte Twisted benutzen, wenn ich nichts einfacheres finde, danke. –

+0

Upvote für die verdrehte Empfehlung. Es ist weit, viel einfacher, Code zu schreiben und zu debuggen, der Twist verwendet, als es für den entsprechenden Thread-Code wäre. – habnabit

0

Sie können versuchen, Prozesse anstelle von Threads zu verwenden. Python hat GIL, was zu einigen Verzögerungen in Ihrer Situation führen kann.

1

Ein Prozess kann Hunderte von Threads auf jedem modernen Betriebssystem problemlos haben.

Wenn Sie bandbreitenbegrenzt sind, bedeutet 1 bis 2 Sekunden 28 bedeutet, dass 40 Sekunden ungefähr richtig sind. Wenn Sie Latenz begrenzt sind, soll es schneller sein, aber ohne Informationen, alles, was ich vorschlagen kann, ist:

  • zu Ihrem Code hinzufügen Anmeldung sicherzustellen, dass es tatsächlich parallel laufen hat, und dass Sie nicht aus Versehen Serialisierung Ihrer Threads irgendwie;
  • Verwenden Sie einen Netzwerkmonitor, um sicherzustellen, dass Netzwerkanforderungen tatsächlich parallel ausgeführt werden.

Es ist schwer, ohne weitere Informationen etwas besseres zu geben.

+0

Ich überprüfte und die Threads starten alle zur selben Zeit und laufen parallel, aber alle kehren zu verschiedenen Zeiten von der urllib-Anfrage zurück. Ich gehe davon aus, dass es etwas mit dem Netzwerk zu tun hat und mehrere Anfragen gleichzeitig bearbeitet. Denkst du das ist das Problem oder ist es etwas anderes? Können mehrere Netzwerkanforderungen gleichzeitig ausgeführt werden? Ich bin auf Windows XP und ich habe eine drahtlose Verbindung, wenn das hilft. Danke für deine Hilfe und entschuldige meine Unwissenheit. Ich bin nicht viel von einer Netzwerkperson. –