2017-06-15 2 views
0
import time 
from threading import Thread 

def s_process(): 
    print('***********************************************') 
    ##time.sleep(2) 
    print('###############################################') 
    ##time.sleep(2) 
    return 

a = Thread(target=s_process) 

while(True): 
    a.start() 
    a.join() 
    a.start() 
    a.join() 

warum wird dieser CodePython-Thread in einem Laufzeitfehler Schleife verursacht (join() nicht für Thread warten zu beenden?)

*********************************************** 
############################################### 
Traceback (most recent call last): 
    File "xxxxxxxxxxxxxxxxxxxxx", line 16, in <module> 
    a.start() 
RuntimeError: threads can only be started once 

sollte nicht join() warten, bis der Thread einen Fehler verursacht ist fertig. und wenn ich falsch verstanden, wie join() funktioniert, wie soll ich warten, bis der Faden ohne Verwendung eines Timeout zu beenden

+0

Ändern Sie Ihren Code zu diesem ** while (True): a = Thread (target = s_process) a.Starten() a.join() ** – Stack

+1

Der Fehler ist nicht auf die ' Join-Linie, es ist auf der Startlinie. Es scheint mir selbsterklärend zu sein: Rufen Sie nicht zweimal am selben Objekt 'start' an. Erstellen Sie bei Bedarf ein neues Thread-Objekt. – Kevin

+0

Sie definieren nur einen Thread, 'a', und Sie haben bereits gestartet plus seine' join() 'Methode aufgerufen. Kann es nicht wieder anfangen! – pstatix

Antwort

0

Diese Arbeit sollte:

import time 
from threading import Thread 

def s_process(): 
    print('***********************************************') 
    ##time.sleep(2) 
    print('###############################################') 
    ##time.sleep(2) 
    return 

while(True): 
    a = Thread(target=s_process) 
    a.start() 
    a.join() 
    del a   #deletes a 
+0

Ist es sicher, so viele Thread-Objekte zu erstellen? würden sie sich mit dem Speicherverbrauch herumschlagen? oder werden sie nach der Fertigstellung bereinigt – confusedsnek

+0

** del a ** wird bereinigen – Stack

+0

, aber diese Methode erstellt 1 Thread zu einer Zeit. Worum geht es, 1 Thread zu erstellen? warum nicht 's_process' direkt aufrufen? –

0

Um mehrere Threads, bauen eine Liste von threading.Thread Objekte zu starten und iterieren ihre start() und join() Methoden eine for Schleife wie folgt:

import time 
from threading import Thread 

def s_process(): 
    print('***********************************************') 
    time.sleep(2) 
    print('###############################################') 
    time.sleep(2) 
    return 

# list comprehension that creates 2 threading.Thread objects 
threads = [Thread(target=s_process) for x in range(0, 2)] 

# starts thread 1 
# joins thread 1 
# starts thread 2 
# joins thread 2 
for thread in threads: 
    try: 
     thread.start() 
     thread.join() 
    except KeyboardInterrupt: # std Python exception 
     continue # moves to next thread iterable 

Edit: inlcuded try/except für KeyboardInterrupt und getestet mit allgemeiner Verwendung Strg + X + C.

+0

Ich muss den gleichen Code ohne Unterbrechung in der Mitte des Ausführungsformulars durchlaufen. KeyboardInterrupt – confusedsnek

+1

Edit enthält jetzt die Ausnahmebehandlung für Ihre Threads. – pstatix

Verwandte Themen