
Moin,
ich habe am Wochenende meine rsten Versuche mit Threading gestartet und habe auch einfache Probleme lösen können, aber leider nicht das, wofür ich es eigentlich brauche. Folgendes Problem (vereinfacht):
Ich habe eine Liste mit ca. 4000 URLs, die ich gerne übertragenmöchte. Alle hintereinander dauert zu lange (drei Stunden), daher der Ansatz, mit Threading 10 URLs gleichzeitig abzuarbeiten.
Ich habe bis jetzt aber noch keine Idee gehabt, wie ich durch die Liste gehe und immer 10 Threads am Laufen halte und am Ende dann auch merke, dass ich durch bin. Alle Bespiele, die ich bisher gefunden habe, lassen immer alle Elemente einer Liste gleichzeitig ablaufen.
Hat jemand ein Beispiel oder Hinweise zur Hand?
Danke Lutz

partitionier die liste mit den 4000 urls in listen für die jeweiligen threads und übergib die jeweilige arbeitsliste dem jeweiligen thread beim anlegen. wirf die threads an und das wars....wo ist also das problem?
-aj
--On Montag, 31. März 2003 10:16 Uhr +0200 Lutz Schroeer latz@elektroelch.de wrote:
Moin,
ich habe am Wochenende meine rsten Versuche mit Threading gestartet und habe auch einfache Probleme lösen können, aber leider nicht das, wofür ich es eigentlich brauche. Folgendes Problem (vereinfacht):
Ich habe eine Liste mit ca. 4000 URLs, die ich gerne übertragenmöchte. Alle hintereinander dauert zu lange (drei Stunden), daher der Ansatz, mit Threading 10 URLs gleichzeitig abzuarbeiten.
Ich habe bis jetzt aber noch keine Idee gehabt, wie ich durch die Liste gehe und immer 10 Threads am Laufen halte und am Ende dann auch merke, dass ich durch bin. Alle Bespiele, die ich bisher gefunden habe, lassen immer alle Elemente einer Liste gleichzeitig ablaufen.
Hat jemand ein Beispiel oder Hinweise zur Hand?
Danke Lutz
-- elektroelch - Free news for a free world
Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
_______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

On Mon, 31 Mar 2003, Andreas Jung wrote:
partitionier die liste mit den 4000 urls in listen für die jeweiligen threads und übergib die jeweilige arbeitsliste dem jeweiligen thread beim anlegen. wirf die threads an und das wars....wo ist also das problem?
Z.B. dass verschiedene URLs unterschiedlich lange brauchen? Ueber die grosse Zahl von URLs mittelt sich das hoffentlich aber sicher kann man sich da nicht sein. (Haengt stark von der Ordnung der Liste ab und wie Du partitionierst.)
Warum nicht alle 4000 URLs in eine Queue stecken, dann 10 Worker-Threads erzeugen, die solange arbeiten, bis die Queue leer ist und sich dann beenden? Der Main-Thread kann dann einfach warten, bis alle 10 Worker fertig sind...
Holger
_______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Moin
Am Montag, 31. März 2003 10:16 schrieb Lutz Schroeer:
[...] Ich habe bis jetzt aber noch keine Idee gehabt, wie ich durch die Liste gehe und immer 10 Threads am Laufen halte und am Ende dann auch merke, dass ich durch bin. Alle Bespiele, die ich bisher gefunden habe, lassen immer alle Elemente einer Liste gleichzeitig ablaufen.
Hat jemand ein Beispiel oder Hinweise zur Hand? [...]
Falls die URLs indexiert sind, gib jedem Thread einen Offset aus dem Intervall [0..9] mit. Jeder Thread kann dann die URLs (n*10) + offset übertragen wobei n von 0 bis unendlich geht. Der Thread ist fertig, wenn eine URL mit dem entsprechenden Index nicht existiert.
Gruß, Christian
_______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Hi,
Falls die URLs indexiert sind, gib jedem Thread einen Offset aus dem Intervall [0..9] mit. Jeder Thread kann dann die URLs (n*10) + offset übertragen wobei n von 0 bis unendlich geht. Der Thread ist fertig, wenn eine URL mit dem entsprechenden Index nicht existiert.
Problem: Wenn zufällig die URLs 1,31,51 und 1171 blockieren, dann braucht einer der Threads zehnmalsolang wie alle anderen.
Besser: Nimm einfach eine Liste.
Produzent: Starte XThreads generiere URLs und pushe sie auf die Liste Pushe X mal "Stirb!" auf die Liste warte auf alle Threads
Thread: while 1: try: pop(0) von der Liste except IndexError: warte_ein_weilchen; continue wenn "Stirb!": stirb # :-) bearbeite Element
Ist doch extrem einfach, oder? Für den Ernstfall (d.h. es sind nicht 4000 sondern 4 Millionen Elemente, die du zB aus einer Datenbank liest) wird es etwas mehr Aufwand, da muss der Produzent ein Weilchen warten wenn die Liste zu lang wird, sonst hast du ein Hauptspeicherproblem.
Bonuspunkte: Mache das Warten mit Semaphoren, nicht mit sleep().

Lutz,
Ich habe eine Liste mit ca. 4000 URLs, die ich gerne übertragenmöchte. Alle hintereinander dauert zu lange (drei Stunden), daher der Ansatz, mit
Threading 10 URLs >gleichzeitig abzuarbeiten.
1.) die Liste der URLs in eine Queue stellen
import Queue urlq=Queue.Queue() downloadfehler=Queue.Queue() for element in urlListe: urlq.put(element)
2.) nen Arbetier definieren
from threading import Thread
class Worker(Thread): def run(self): global urlq while True: meineURL=urlq.get_nowait() # abfangen, wenn die Queue zwischenzeitlich von anderem Thread gelert wurde if meineURL is None: break try:: .... #irgendwas wie wget meineURL except: downloadfehler.put(meineURL)
3.) ein Rudel Arbeitsthreads erzeugen & starten
for i in range(anzahldergewünschtenthreads): nixda=Worker() nixda.run()
Ich habe bis jetzt aber noch keine Idee gehabt, wie ich durch die Liste
gehe und immer 10 >Threads am Laufen halte und am Ende dann auch merke, dass ich durch bin. Die Threads terminieren selbständig, wenn nix mehr in der Queue ist. Kannst sogar die Queue nach und nach befüllen, solange sie nicht leer ist, laufen die Threads weiter.
Gruß
Harald
_______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de

Hi,
On Monday 31 March 2003 11:54, Harald Armin Massa wrote:
1.) die Liste der URLs in eine Queue stellen
Queue hat gegenüber "kleine_Array+Semaphoren" den Nachteil dass sie umne Größenordnung lahmer ist (war jedenfalls so das letzte Mal als ich das getestet habe).
import Queue urlq=Queue.Queue()
Hier kann man praktischerweise eine maxsize definieren.
for element in urlListe: urlq.put(element)
class Worker(Thread): meineURL=urlq.get_nowait() if meineURL is None: break 3.) ein Rudel Arbeitsthreads erzeugen & starten
Wie gesagt -- die ganze Liste füllen und dann erst die Threads starten ist spätestens bei vielen URLs oder nichttrivialer URL-Generierung kontraproduktiv. (Die urlliste ist bei mir im Übrigen grundsätzlich ein Iterator. ;-)
Wenn du ohne nowait arbeitest, brauchst du natürlich einen Stop-Marker. Das geht bei Queue aber genauso wie bei simpler Array.
Kannst sogar die Queue nach und nach befüllen, solange sie nicht leer ist, laufen die Threads weiter.
Das würde ich nicht tun... solche Programmier-Abkürzungen tendieren dazu, früher oder später gewaltig in die Hose zu gehen.

Lutz Schroeer wrote:
Ich habe bis jetzt aber noch keine Idee gehabt, wie ich durch die Liste gehe und immer 10 Threads am Laufen halte und am Ende dann auch merke, dass ich durch bin. Alle Bespiele, die ich bisher gefunden habe, lassen immer alle Elemente einer Liste gleichzeitig ablaufen.
Deine 4000 urls in eine Liste kopieren. Ich würde eine funktion bauen die immer eine URL zurückgibt, und diese aus der Liste löscht, beim ende eine Exception auswirft. Beachte dabei, daß immer nur ein Thread in der Funktion aktiv sein darf (Locking).
Jeder Thread ist in einer Schlaufe bis eine Exception aufgeworfen wird, und arbeitet dann einfach immer die nächste Url ab.
Ganz einfach ;)
Grüße Daniel
_______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de
participants (7)
-
Andreas Jung
-
Christian Mönch
-
daniel.poelzleithner
-
Harald Armin Massa
-
holly@python.net
-
Lutz Schroeer
-
Matthias Urlichs