Anzahl von gleichz. Threads begrenzen für Anfänger (Queue)
Verfasst: Dienstag 4. Juli 2006, 14:29
Ich hab nun schon einige Beispiele und Erklärungen gelesen, so recht will der Groschen jedoch noch nicht fallen.
Mein Ziel: Ich will URL aus einer DB holen und der Reihe nach abarbeiten. Da eine Verbindung zur gleichen Zeit verschwendung wäre, da ja massig Zeit aufgrund der Requests, Daten übertragen usw. drauf geht muss also mehree Threads her. Ich bin wahrscheinlich auch nicht der erste mit dieser Problemstellung.
Bevor ich mich dadran wagen wollte hab ich einige Experimente gemacht und schon da kann ich mir einiges nicht erklären.
Ok, Threads mit dem einfachen thread-Modul starten klappt schonmal. Nur wie kann ich es umgehen, dass der Hauptprozess beendet wird, bevor die Threads zuende gearbeitet haben? Der time.sleep(5) Notbehelf ist nun nicht gerade der Hit.
Auf in die Nächste Runde, diesmal sollen nur 2 Threads gleichzeitig laufen.
Das Script läut sich tot, es gibt nichts aus, der Prozess läuft einfach und nichts passiert, bis ich ihn irgendwann manuell beende. Auch die Nummer mit der Queue auf 2 begrenzen ist im Nachhinein falsch, da ich ja, sobald ich ein Element aus dem Wartezimmer nehme, ein neues nachrutscht. Das Ende vom Lied: Alle Threads laufen wieder auf einmal.
Kann mir da jemand ein wenig helfen, soll ich womöglich lieber gelich mit Klassen und dem "großen" Threads Modul arbeiten? Wär nett, wenn mir jemand einen simplen Beispieltcode schreiben könnte, muss ja nichts grosses sein. Bin für jede Hilfe dankbar.
Mein Ziel: Ich will URL aus einer DB holen und der Reihe nach abarbeiten. Da eine Verbindung zur gleichen Zeit verschwendung wäre, da ja massig Zeit aufgrund der Requests, Daten übertragen usw. drauf geht muss also mehree Threads her. Ich bin wahrscheinlich auch nicht der erste mit dieser Problemstellung.
Bevor ich mich dadran wagen wollte hab ich einige Experimente gemacht und schon da kann ich mir einiges nicht erklären.
Code: Alles auswählen
import Queue
import time
import random
import thread
def worker(name):
wzeit = random.randint(1,300)/100.0
time.sleep(wzeit)
print name,'wartezeit:'+str(wzeit)
for i in ['Hans','Dieter','Klaus','Bert','Lisa','Paul']: #Lisa ist nur dabei, damit die Frauenquote stimmt o.0
thread.start_new_thread(worker,(i,))
time.sleep(5)
Auf in die Nächste Runde, diesmal sollen nur 2 Threads gleichzeitig laufen.
Code: Alles auswählen
import Queue
import time
import random
import thread
import threading
#Wir legen das "Wartezimmer" mit 2 Sitzplätzen an
schlange = Queue.Queue(2)
#Wir legen fest, was der Thread überhaupt machen soll
def worker(name):
#soleneg noch was im "Wartezimmer" ist soll ein Thread gestartet werden und seine Arbeit machen
if schlange.qsize()!=0:
thread.start_new_thread(worker,(schlange.get(),))
wzeit = random.randint(1,300)/100.0
time.sleep(wzeit)
print name,'wartezeit:'+str(wzeit),'Elemente in schlange:',schlange.qsize()
#Das "Wartezimmer" wird gefüllt und der Rest muss draußen bleiben, auch die Privatversicherten
for i in ['Hans','Dieter','Klaus','Bert','Lisa','Paul']:
#Wir packen Elemente ins Wartezimmer, der Rest wird, wenn ich die
#http://docs.python.org/lib/QueueObjects.html
#richtig verstehe, geblockt (bleibt vor der Tür) bis wieder Platz ist.
schlange.put(i)
thread.start_new_thread(worker,(schlange.get(),))
time.sleep(5)
Kann mir da jemand ein wenig helfen, soll ich womöglich lieber gelich mit Klassen und dem "großen" Threads Modul arbeiten? Wär nett, wenn mir jemand einen simplen Beispieltcode schreiben könnte, muss ja nichts grosses sein. Bin für jede Hilfe dankbar.