Python threading self._stop () El objeto ‘Evento’ no se puede llamar

Intentando un hilo “stoppable” de https://stackoverflow.com/a/325528/1619432 así:

import sys import threading import time import logging class StoppableThread(threading.Thread): """Thread class with a stop() method. The thread itself has to check regularly for the stopped() condition.""" def __init__(self): print( "base init", file=sys.stderr ) super(StoppableThread, self).__init__() self._stop = threading.Event() def stop(self): print( "base stop()", file=sys.stderr ) self._stop.set() def stopped(self): return self._stop.is_set() class datalogger(StoppableThread): """ """ import time def __init__(self, outfile): """ """ StoppableThread.__init__(self) self.outfile = outfile print( "thread init", file=sys.stderr ) def run(self): """ """ print( "thread running", file=sys.stderr ) while not self.stopped(): print( self.outfile , file=sys.stderr) time.sleep(0.33) print( "thread ending", file=sys.stderr ) test = datalogger("test.txt") test.start() time.sleep(3) logging.debug("stopping thread") test.stop() logging.debug("waiting for thread to finish") test.join() 

Da la siguiente salida con error:

 > demo.py base init thread init thread running test.txt test.txt test.txt test.txt test.txt test.txt test.txt test.txt test.txt test.txt base stop() thread ending Traceback (most recent call last): File "demo.py", line 54, in  test.join() File "C:\Python34\lib\threading.py", line 1061, in join self._wait_for_tstate_lock() File "C:\Python34\lib\threading.py", line 1079, in _wait_for_tstate_lock self._stop() TypeError: 'Event' object is not callable 

¿Podría alguien explicar por favor lo que estoy haciendo mal?

Doc: https://docs.python.org/3.4/library/threading.html#event-objects

La solución se menciona en un comentario a la respuesta mencionada anteriormente:

self._stop ya utiliza self._stop .

Este código modificado funciona (cambios marcados con comentarios):

 import sys import threading import time import logging class StoppableThread(threading.Thread): """Thread class with a stop() method. The thread itself has to check regularly for the stopped() condition.""" def __init__(self): print( "base init", file=sys.stderr ) super(StoppableThread, self).__init__() self._stopper = threading.Event() # ! must not use _stop def stopit(self): # (avoid confusion) print( "base stop()", file=sys.stderr ) self._stopper.set() # ! must not use _stop def stopped(self): return self._stopper.is_set() # ! must not use _stop class datalogger(StoppableThread): """ """ import time def __init__(self, outfile): """ """ StoppableThread.__init__(self) self.outfile = outfile print( "thread init", file=sys.stderr ) def run(self): """ """ print( "thread running", file=sys.stderr ) while not self.stopped(): print( self.outfile , file=sys.stderr) time.sleep(0.33) print( "thread ending", file=sys.stderr ) test = datalogger("test.txt") test.start() time.sleep(3) logging.debug("stopping thread") test.stopit() # (avoid confusion) logging.debug("waiting for thread to finish") test.join()