2017-02-09 2 views
0

Die Sache ist, ich möchte alle Thread, die zur Zeit laufen zu töten.Zum Beispiel habe ich eine einzige Taste, deren Aufruf die for-Schleife. und plötzlich möchte ich aufhören.Python Thread beenden oder killen auf die beste Weise

hier sind meine Codes:

class WorkerThread(threading.Thread): 
    def __init__(self,t,*args): 
     super(WorkerThread,self).__init__(target=t,args=(args[0],args[3])) 
     self.start() 
     self.join() 

meine Implementierung:

def running(fileopen,methodRun): 
    #....long task of code are here... 


for file in fileTarget: 
     threads.append(WorkerThread(running,file,count,len(fileTarget),"FindHeader")) 
+0

eine boolean-Flag gesetzt, der den Thread-Ausführungsblock sperrt, bald oder später können Sie den Zustand der Markierung ändern, lassen den Faden seinen Lauf beenden Methode sauber .... –

+0

Hallo Herr, danke für Ihren Vorschlag konnten Sie einige Codes zeigen, um das zu handhaben? 2 bis 4 Zeilen Code wird ausreichen. – iamcoder

+3

Mögliches Duplikat von [Gibt es eine Möglichkeit, einen Thread in Python zu beenden?] (Http://stackoverflow.com/questions/323972/is-there-any-way-to-kill-a-thread-in-python) –

Antwort

1

Versuchen Sie niemals abrupt einen Thread zu beenden. Richten Sie stattdessen ein Flag/Signal in Ihrer Klasse WorkerThread ein, und wenn Sie möchten, dass es aufhört, setzen Sie einfach die Markierung und machen Sie den Thread selbst fertig.

Auch Sie haben Missverständnisse darüber, wie man threading.Thread Unterklasse. Wenn Sie sich entscheiden, eine Funktion als Thread ausgeführt, sollte es sein:

thread = threading.Thread(target=my_func, args=(arg1, arg2...)) 
thread.start() 

Nun, dies in Ihrem Fall nicht für Ihre Bedürfnisse passen, da Sie den Faden wollen, wenn gebetene zu stoppen. So jetzt lassen Sie uns Unterklasse threading.Thread, im Grunde __init__ ist wie ein Konstruktor in Python, jedes Mal, wenn eine Instanz erstellt wird, wird es ausgeführt werden. Und Sie sofort start() der Faden und dann blockieren mit join(), was sie tut, ist in der for-Schleife threads.append(WorkerThread(running,file,count,len(fileTarget),"FindHeader")) blockiert bis zum Ende des running fertig mit file und geht dann mit einem anderen file zu arbeiten, kein eigentlicher Faden verwendet wird.

sollten Sie bewegen running(fileopen,methodRun) in run():

class WorkerThread(threading.Thread): 
    def __init__(self,*args): 
     super(WorkerThread,self).__init__() 
     self.arg_0 = arg[0] 
     self.arg_1 = arg[1] 
     ... 
     self.stop = False 

    def run(self): 
     # now self.arg_0 is fileopen, and self.arg_1 is methodRun 
     # move your running function here 
     #....long task of code are here... 

     Try to do self.stop check every small interval, e.g. 

     ... 

     if self.stop: 
      return 

     ... 



for file in fileTarget: 
    new_thread = WorkerThread(file, count, len(fileTarget), "FindHeader")) 
    new_thread.start() 

    threads.append(new_thread) 

# Stop these threads 
for thread in threads: 
    thread.stop = True 
Verwandte Themen