2017-02-09 9 views
0

Дело в том, что я хочу убить весь поток, который в настоящее время работает. Например, у меня есть одна кнопка, вызывающая цикл for. и вдруг я хочу остановить его.python thread прекращает или убивает наилучшим образом

вот мои коды:

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

моя реализация:

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


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

установлен логический флаг, который блокирует блок выполнения резьбы, рано или поздно вы можете изменить состояние флага, позволяя нить, чтобы закончить свой бег метод чисто .... –

+0

привет сэр, спасибо за ваше предложение, не могли бы вы показать некоторые коды, чтобы справиться с этим? От 2 до 4 строк кода. – iamcoder

+3

Возможный дубликат [Есть ли способ убить поток в Python?] (Http://stackoverflow.com/questions/323972/is-there-any-way-to-kill-a-thread-in-python) –

ответ

1

Никогда не пытайтесь резко прекратить поток. Вместо этого установите флаг/сигнал в свой класс WorkerThread, а затем, когда вы хотите, чтобы он остановил, просто установите флаг и сделайте поток завершенным сам по себе.

Также у вас есть недоразумения в отношении подкласса threading.Thread. Если вы решили запустить функцию как нить, она должна быть:

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

Ну, в вашем случае это не будет соответствовать вашим потребностям, так как вы хотите, чтобы нить, чтобы остановить при запросе. Итак, теперь давайте подкласс threading.Thread, в основном __init__ как конструктор в python, каждый раз, когда создается экземпляр, он будет выполнен. И вы сразу же нажмете start() поток, а затем заблокируете его join(), что он делает в вашей петле для цикла threads.append(WorkerThread(running,file,count,len(fileTarget),"FindHeader")) будет блокировать до конца running, закончил с file, а затем продолжает работать с другим file, фактическая нить не используется.

Вы должны переместить ваш running(fileopen,methodRun) в 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