Cómo terminar un hilo en Python sin bucle en el método run?

Tener la clase que tiene una larga método.

La creación de un hilo para ese método.

Cómo puedo matar\terminar este hilo?

Principal problema es que yo no puedo comprobar roscado.Evento en el hilo run() método porque no contiene el bucle.

Código Similar a esta:

import time
import threading

class LongAction:
    def time_consuming_action(self):
        tmax = 600
        for i in range(tmax):
            print i
            time.sleep(1)
        time.sleep(tmax)
        self.tmax = tmax
        return "Slept well"

class LongActionThread(threading.Thread):
    def __init__(self, la_object):
        self.la = la_object
        threading.Thread.__init__(self)

    def run(self):
        self.la.time_consuming_action()


la = LongAction()
la_thread = LongActionThread(la)
la_thread.start()

# After 5 sec i've changed my mind and trying to kill LongActionThread
time.sleep(5)
print "Trying to kill LongActionThread"
la_thread.kill()
  • no es generalmente una buena idea para matar a un hilo : stackoverflow.com/questions/323972/…
  • Entiendo, pero tengo que. Leer este enlace, pero el primer ejemplo no ayuda. Supongo que sólo hay una manera – con excepción?
  • Si usted puede ser que necesite para matar a una tarea, es mucho mejor a que se ejecute en un proceso de un hilo. Consulte el multiprocesamiento módulo, por ejemplo.
  • Es su real time_consuming_action en Python? ¿Contiene un bucle donde se puede insertar el evento de verificación?
  • time_consuming_action es en Python, pero no puedo cambiar.
  • Puede ser este enlace útil para usted… stackoverflow.com/questions/6524459/stopping-a-thread-python

InformationsquelleAutor ambi | 2012-12-03

2 Kommentare

  1. 1

    Este código funciona bien, pero hay una necesidad explícita de vaciar los datos de salida estándar.

    No han encontrado una manera donde se imprime sería trabajar sin rubor.

    import time
    from multiprocessing.process import Process
    import sys
    
    class LongAction:
        def time_consuming_action(self):
            tmax = 600
            for i in range(tmax):
                print i
                time.sleep(1)
                sys.stdout.flush()
            time.sleep(tmax)
            self.tmax = tmax
            return "Slept well"
            sys.stdout.flush()
    
    class LongActionThread(Process):
        def __init__(self, la_object):
            self.la = la_object
            Process.__init__(self)
    
        def run(self):
            self.la.time_consuming_action()
    
    if __name__ == "__main__":
        la = LongAction()
        la_thread = LongActionThread(la)
        la_thread.start()
    
        # After 5 sec i've changed my mind and trying to kill LongActionThread
        time.sleep(5)
        print "Trying to kill LongActionThread"
        la_thread.terminate()
    • El OP dice time_consuming_action() no puede ser cambiado.
  2. 0

    Si bien no es una buena idea para matar a un hilo, si usted realmente tiene que hacerlo, la solución más fácil es implementar un ejecutando semaphor, divide su tiempo método que consume en sub_methods y verificación para el hilo de estado entre el submethods.

    Código en parte copiado de de este MODO la pregunta:

    class StoppableThread(threading.Thread):
        """Thread class with a stop() method. The thread itself has to check
        regularly for the stopped() condition."""
    
        def __init__(self,la_object):
            super(StoppableThread, self).__init__()
            self.la = la_object
            self._stop = threading.Event()
    
        def stop(self):
            self._stop.set()
    
        def stopped(self):
            return self._stop.isSet()
    
        def run(self):
           self.la.time_consuming_action( self.stopped )
    
        class La :
    
          def __init__(self):
          #init here
    
          def time_consuming_action(self, thread_stop_callback ):
    
              sub_work1()
    
              if thread_stop_callback():
                 raise 'Thread Killed ! '
    
              sub_work2()
    
              if thread_stop_callback():
                 raise 'Thread Killed ! '
    
              sub_work3()
    
              #etc...
    • El problema es que yo no puedo cambiar LongAction de la clase

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea