Pausar un hilo usando la clase de hilos.

Tengo un proceso largo que he progtwigdo para ejecutarse en un hilo, porque de lo contrario congelaría la interfaz de usuario en mi aplicación wxpython.

Estoy usando

threading.Thread(target = myLongProcess).start() 

para iniciar el hilo y funciona, pero no sé cómo pausar y reanudar el hilo. Busqué en los documentos de Python los métodos anteriores, pero no pude encontrarlos.

¿Alguien podría sugerir cómo podría hacer esto?

Gracias.

Yo mismo estaba teniendo el mismo problema, hasta que encontré la respuesta.

También hice algunas pruebas de velocidad, el tiempo para establecer la bandera y para la acción que se debe tomar es agradablemente rápido 0.00002 segundos en una caja de Linux con 2 procesadores lentos.

Ejemplo de prueba de pausa de hilo usando eventos set () y clear ()

Por Rich O’Regan

 import threading import time # This function gets called by our thread.. so it basically becomes the thread innit.. def wait_for_event(e): while True: print '\tTHREAD: This is the thread speaking, we are Waiting for event to start..' event_is_set = e.wait() print '\tTHREAD: WHOOOOOO HOOOO WE GOT A SIGNAL : %s', event_is_set e.clear() # Main code.. e = threading.Event() t = threading.Thread(name='your_mum', target=wait_for_event, args=(e,)) t.start() while True: print 'MAIN LOOP: still in the main loop..' time.sleep(4) print 'MAIN LOOP: I just set the flag..' e.set() print 'MAIN LOOP: now Im gonna do some processing n shi-t' time.sleep(4) print 'MAIN LOOP: .. some more procesing im doing yeahhhh' time.sleep(4) print 'MAIN LOOP: ok ready, soon we will repeat the loop..' time.sleep(2) 

No hay un método para que otros subprocesos hagan una pausa forzada de un subproceso (más de lo que hay para que otros subprocesos eliminen ese subproceso): el subproceso de destino debe cooperar comprobando ocasionalmente las “banderas” apropiadas (un threading.Condition podría ser apropiada para el caso de pausa / pausa de pausa).

Si está en una plataforma unix-y (básicamente cualquier otra cosa que no sea Windows), puede usar multiprocessing lugar de threading , eso es mucho más poderoso y le permite enviar señales al “otro proceso”; SIGSTOP debe pausar incondicionalmente un proceso y SIGCONT lo continúa (si su proceso necesita hacer algo bien antes de pausar, considere también la señal SIGTSTP , que el otro proceso puede detectar para realizar dichos deberes previos a la suspensión. Puede haber formas de obtener el mismo efecto en Windows, pero no tengo conocimiento de ellos, si los hay).

Puede usar señales: http://docs.python.org/library/signal.html#signal.pause

Para evitar el uso de señales, puede utilizar un sistema de paso de token. Si desea pausarlo desde el subproceso de la interfaz de usuario principal, probablemente podría usar un objeto Queue.Queue para comunicarse con él.

Simplemente coloque un mensaje indicando al hilo el tiempo de espera durante un cierto período de tiempo en la cola.

Alternativamente, simplemente puede insertar fichas en la cola desde el subproceso de la interfaz de usuario principal. El trabajador solo debe revisar la cola cada N segundos (0.2 o algo así). Cuando no hay tokens para sacar de la cola, se bloqueará el subproceso de trabajo. Cuando desee que comience de nuevo, simplemente comience a insertar los tokens en la cola desde el hilo principal nuevamente.

El módulo de multiprocesamiento funciona bien en Windows. Vea la documentación aquí (final del primer párrafo):

http://docs.python.org/library/multiprocessing.html

En el canal de IRC de wxPython, tuvimos un par de becarios que intentaron el multiprocesamiento y dijeron que funcionó. Desafortunadamente, todavía no he visto a nadie que haya escrito un buen ejemplo de multiprocesamiento y wxPython.

Si usted (o alguien más aquí) tiene algo, agréguelo a la página de wxPython wiki en el enlace aquí: http://wiki.wxpython.org/LongRunningTasks

Es posible que desee revisar esa página independientemente de que tenga varios ejemplos interesantes que utilizan subprocesos y colas.

Puede echar un vistazo a la API de Windows para la suspensión de subprocesos .

Que yo sepa, no hay un equivalente de POSIX / pthread. Además, no puedo determinar si los identificadores / identificadores de hilos están disponibles desde Python . También hay problemas potenciales con Python, ya que su progtwigción se realiza utilizando el progtwigdor nativo, es poco probable que se espere que los hilos se suspendan, especialmente si se suspenden los hilos mientras se mantiene la GIL, entre otras posibilidades.