Seite 1 von 1

Hilfe bei threads

Verfasst: Montag 21. November 2011, 12:53
von D4rkie
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

Re: Hilfe bei threads

Verfasst: Montag 21. November 2011, 13:07
von Dav1d
Thread.join

Re: Hilfe bei threads

Verfasst: Montag 21. November 2011, 16:27
von D4rkie
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 ??

Re: Hilfe bei threads

Verfasst: Montag 21. November 2011, 16:32
von Dav1d
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()

Re: Hilfe bei threads

Verfasst: Montag 21. November 2011, 17:41
von D4rkie
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 ?

Re: Hilfe bei threads

Verfasst: Montag 21. November 2011, 17:44
von EyDu
Lass dir mal vor dem ``t.join`` mittels print ausgeben, was t enthält ;-)

Re: Hilfe bei threads

Verfasst: Montag 21. November 2011, 17:46
von 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.

Re: Hilfe bei threads

Verfasst: Montag 21. November 2011, 17:47
von D4rkie
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

Re: Hilfe bei threads

Verfasst: Montag 21. November 2011, 17:49
von D4rkie
@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 ??

Re: Hilfe bei threads

Verfasst: Montag 21. November 2011, 18:00
von D4rkie
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()

Re: Hilfe bei threads

Verfasst: Montag 21. November 2011, 18:04
von /me
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.

Re: Hilfe bei threads

Verfasst: Montag 21. November 2011, 18:10
von D4rkie
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 ;)

Re: Hilfe bei threads

Verfasst: Montag 21. November 2011, 18:32
von D4rkie
könnte mir vllt jemand erklären sich der Name des Prozesses ergibt

Bzw wie ich das .join statement sinnvoll einsetzen kann ?

Re: Hilfe bei threads

Verfasst: Montag 21. November 2011, 18:37
von D4rkie
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

Re: Hilfe bei threads

Verfasst: Montag 21. November 2011, 22:45
von JonasR
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...

Re: Hilfe bei threads

Verfasst: Montag 21. November 2011, 22:55
von Dav1d
Nichts.

Re: Hilfe bei threads

Verfasst: Dienstag 22. November 2011, 08:43
von JonasR
Dann ist gut =)