Hilo que puedo pausar y reanudar?

Estoy tratando de crear un hilo, que hace cosas en el fondo. Necesito poder hacer una “pausa” efectiva cuando la necesito y “reanudarla” más tarde. Además, si el subproceso está en medio de hacer algo cuando lo “pausa”, debería hacer que el subproceso de llamada espere hasta que termine lo que está haciendo.

Soy bastante nuevo en Multithreading en Python, así que no he llegado tan lejos.

Lo que tengo prácticamente hace todo, excepto hacer que el subproceso de llamada espere si se hace una pausa mientras mi hilo está haciendo algo.

Aquí está el resumen de lo que estoy tratando de lograr en el código:

import threading, time class Me(threading.Thread): def __init__(self): threading.Thread.__init__(self) #flag to pause thread self.paused = False def run(self): while True: if not self.paused: #thread should do the thing if #not paused print 'do the thing' time.sleep(5) def pause(self): self.paused = True #this is should make the calling thread wait if pause() is #called while the thread is 'doing the thing', until it is #finished 'doing the thing' #should just resume the thread def resume(self): self.paused = False 

Creo que básicamente necesito un mecanismo de locking, ¿pero dentro del mismo hilo?

Se puede usar la Condition s para esto .

Aquí hay un ejemplo rellenando tu esqueleto:

 class Me(threading.Thread): def __init__(self): threading.Thread.__init__(self) #flag to pause thread self.paused = False # Explicitly using Lock over RLock since the use of self.paused # break reentrancy anyway, and I believe using Lock could allow # one thread to pause the worker, while another resumes; haven't # checked if Condition imposes additional limitations that would # prevent that. In Python 2, use of Lock instead of RLock also # boosts performance. self.pause_cond = threading.Condition(threading.Lock()) def run(self): while True: with self.pause_cond: while self.paused: self.pause_cond.wait() #thread should do the thing if #not paused print 'do the thing' time.sleep(5) def pause(self): self.paused = True # If in sleep, we acquire immediately, otherwise we wait for thread # to release condition. In race, worker will still see self.paused # and begin waiting until it's set back to False self.pause_cond.acquire() #should just resume the thread def resume(self): self.paused = False # Notify so thread will wake after lock released self.pause_cond.notify() # Now release the lock self.pause_cond.release() 

Espero que ayude.

Use threading.Event lugar de una variable booleana, y agregue otro evento para el estado ocupado:

 def __init__(self): ... self.can_run = threading.Event() self.thing_done = threading.Event() self.thing_done.set() self.can_run.set() def run(self): while True: self.can_run.wait() try: self.thing_done.clear() print 'do the thing' finally: self.thing_done.set() def pause(self): self.can_run.clear() self.thing_done.wait() def resume(self): self.can_run.set() 

edición : la respuesta anterior fue incorrecta, la arreglé y cambié los nombres de las variables para que queden claros