Hilfe bei threads

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
D4rkie
User
Beiträge: 26
Registriert: Montag 24. Januar 2011, 21:59

Hallo leute,

bin gerade entwas überfordert und bitte euch deshalb um hilfe =)

Ich habe folgenden Code:

Code: Alles auswählen

# Telnetverbinduung zu jedem Switch starten

for IP in switch_liste:
    t = Thread(target=My_tel2switch.sw_tftpupload,args=(IP,))
    t.start()

#Backupdateien ordnen

for IP in switch_liste:
    x = Thread(target=My_tel2switch.d_handle,args=(IP,))
    x.start()
ich möchte die 2. for-schleife erst beginnen sobald der letzte thread der ersten for-schleife beendet/abgearbeitet ist

Wie kann ich das machen ??

danke für die hilfe

Gruß D4rkie
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Thread.join
the more they change the more they stay the same
D4rkie
User
Beiträge: 26
Registriert: Montag 24. Januar 2011, 21:59

dankeschön

versteh ich die theorie richtig
wenn ich t.join() aufrufe

wird gewartet bis alle threads du mit t.start() aufgerufen werden beendet sind ??
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Nein, angenommen du hast 3 Threads t1, t2 und t3 und du rufst nur die t1.join auf, wird auch nur so lange gewartet bis dieser Thread "fertig" ist. Deshalb macht man das oft so:

Code: Alles auswählen

threads = [t1, t2, t3]

for t in threads:
    t.join()
Wobei das dem entspricht:

Code: Alles auswählen

t1.join()
t2.join()
t3.join()
the more they change the more they stay the same
D4rkie
User
Beiträge: 26
Registriert: Montag 24. Januar 2011, 21:59

habe mir jetzt das hier zs gebastelt

Code: Alles auswählen

#Thread join erstellen

t = str("t"+ str(i))
i = int(i) + 1

# Telnetverbinduung zu jedem Switch starten
for IP in switch_liste:
    t = Thread(target=My_tel2switch.sw_tftpupload,args=(IP,))
    t.start()   
    t = str("t"+ str(i))
    threads.append(t)
    i = int(i) + 1

# Warten bis alle Telnet verbindungen beendet sind
for t in threads: 
    t.join()
doch er gibt mri folgende fehlermeldung :
Traceback (most recent call last):
File "./Switch.py", line 63, in <module>
t.join()
TypeError: join() takes exactly one argument (0 given)
is doch aber genau das Selbe was du geschrieben hast oder ?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Lass dir mal vor dem ``t.join`` mittels print ausgeben, was t enthält ;-)
Das Leben ist wie ein Tennisball.
BlackJack

@D4rkie: Das ist ziemlicher Unsinn was Du da geschrieben hast und die Ausnahme passt auch nicht zum Code. Da würde man eher einen `AttributeError` erwarten weil Zeichenketten keine `join()`-Methode haben.
D4rkie
User
Beiträge: 26
Registriert: Montag 24. Januar 2011, 21:59

bekomme ich das hier raus
t1
t2
t3
t4
t5
t6
t7
t8
t9
t10
t11
t12
t13
t14
t15
t16
t17
t18
t19
t20
t21
t22
t23
t24
t25
t26
t27
t28
t29
t30
t31
t32
t33
t34
t35
t36
t37
t38
t39
t40
t41
t42
t43
t44
D4rkie
User
Beiträge: 26
Registriert: Montag 24. Januar 2011, 21:59

@BlackJack

sry programmier seit ner woche oder 2 mit python habvorher noch nie mit Threads gearbeitet und allgemein wenig bis 0 programmier erfahrung

Was für ne Ausnahme ??
D4rkie
User
Beiträge: 26
Registriert: Montag 24. Januar 2011, 21:59

sry kommt davon wenn man 4 std schläft und dann 10 std programmiert :D

eben total das falsche rein kopiert

Code: Alles auswählen

# Telnetverbinduung zu jedem Switch starten
for IP in switch_liste:
    t = Thread(target=My_tel2switch.sw_tftpupload,args=(IP,))
    t.start()   
    x = str("t"+ str(i))
    threads.append(x)
    i = int(i) + 1

# Warten bis alle Telnet verbindungen beendet sind
for t in threads: 
    t.join()
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Was du in deiner Liste brauchst sind die erzeugten Thread-Instanzen und nicht Strings, deren Namen dem im Code verwendeten Bezeichner der Thread-Instanz ähneln.
D4rkie
User
Beiträge: 26
Registriert: Montag 24. Januar 2011, 21:59

achso ich dachte wenn ich die threads aufrufe erstellt sich automatisch ein Prozess mit der id t1, t2, t3, ......
wie gesagt habe die theorie dahinter net wirklich durchblickt ;)
D4rkie
User
Beiträge: 26
Registriert: Montag 24. Januar 2011, 21:59

könnte mir vllt jemand erklären sich der Name des Prozesses ergibt

Bzw wie ich das .join statement sinnvoll einsetzen kann ?
D4rkie
User
Beiträge: 26
Registriert: Montag 24. Januar 2011, 21:59

Ok hat sich erledigt Problem gelöst hab mir anhand dieses Beispiels hergeleitet

Code: Alles auswählen

import threading 
 
class PrimzahlThread(threading.Thread): 
    def __init__(self, zahl): 
        threading.Thread.__init__(self) 
        self.Zahl = zahl 
 
    def run(self): 
        i = 2 
        while i*i < self.Zahl: 
            if self.Zahl % i == 0: 
                print "%d ist nicht prim, da %d = %d * %d" % ( 
                    self.Zahl, self.Zahl, i, self.Zahl / i) 
                return 
            i += 1 
        print "%d ist prim" % self.Zahl 
 
meine_threads = [] 
 
while 1: 
    eingabe = raw_input("> ") 
    if eingabe == "ende": 
        break 
 
    thread = PrimzahlThread(long(eingabe)) 
    meine_threads.append(thread) 
    thread.start() 
 
for t in meine_threads: 
    t.join()

Meine Lösung sieht wie folgt aus :

Code: Alles auswählen

# Telnetverbinduung zu jedem Switch starten
for IP in switch_liste:
    t = Thread(target=My_tel2switch.sw_tftpupload,args=(IP,))
    t.start()
    threads.append(t)

# Warten bis alle Telnet verbindungen beendet sind
for t in threads:
    t.join()

Danke für die Hilfe von allen !!!

Gruß D4rkie
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

Was passiert wenn man einem schon beendeten Thread joinen will? :D Nur mal so als mögliche Fehlerquelle.
Weiß es selber nicht ich ahne nur dass das böse enden könnte...
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Nichts.
the more they change the more they stay the same
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

Dann ist gut =)
Antworten