Tengo un largo proceso que he programado para que se ejecute en un hilo, porque de lo contrario se va a congelar la interfaz de usuario en mi wxpython aplicación.

Estoy usando

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

para iniciar el hilo y funciona, pero no sé cómo pausar y reanudar el hilo. Me miré en el python docs para los métodos anteriores, pero no fue capaz de encontrar.

Podría alguien sugerir cómo podría hacer esto?

Gracias.

OriginalEl autor jimbo | 2010-07-16

5 Comentarios

  1. 11

    Yo estaba teniendo el mismo problema yo mismo, hasta que he encontrado la respuesta.

    Hice algunas pruebas de velocidad, así, el tiempo para establecer la bandera y a la acción es muy rápida 0.00002 segundos en un lento 2 procesador de Linux.

    Ejemplo el hilo de pausa prueba usando set() & clear() eventos

    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)
    Con el fin de responder a la pregunta, que probablemente tendría un objeto thread_resume = threading.Evento() y, a continuación, thread_resume.set(). En tu hilo, compruebe thread_resume.wait() en el momento conveniente. Si otro hilo llamadas thread_resume.clear(), el hilo se va a pausar y reanudar cuando otro hilo llamadas thread_resume.set()
    Estos son los más emocionados comentario y salida de cadenas de caracteres que he visto nunca.

    OriginalEl autor Rich

  2. 8

    No hay ningún método para otros hilos por la fuerza a hacer una pausa de un hilo (más de lo que hay por otros hilos a matar a ese hilo) — el subproceso de destino deben cooperar en ocasiones comprobación de la adecuada «banderas» (un threading.Condition podría ser apropiada para la pausa/reanudar caso).

    Si estás en un unix-y de la plataforma (nada pero de windows, básicamente), se podría utilizar multiprocessing en lugar de threadingque es mucho más potente, y permite enviar señales a la otra «proceso»; SIGSTOP debe incondicionalmente pausa de un proceso y SIGCONT continúa (si el proceso necesita de hacer algo justo antes de que se detiene, considerar también la SIGTSTP de la señal, que el otro proceso puede coger a realizar pre-suspensión de funciones. (Puede haber maneras de obtener el mismo efecto en Windows, pero no estoy bien informado acerca de ellos, si los hubiere).

    Por desgracia, soy de orientación de windows, así que no creo que voy a ser capaz de utilizar el multiprocesamiento. No quiero un hilo para pausar la otra, solo quiero mandar un mensaje a la conversación diciéndole que se detenga a sí mismo(o es la misma cosa, como dice un hilo para pausar la otra?), puede que se hace modificando el hilo de la clase?
    «Enviar un mensaje» se puede hacer, literalmente, por una Cola, pero (como dije) más práctica para este caso con una Condición. Pero el objetivo de la rosca debe controlar periódicamente el estado (o Cola) con el fin de recepción los «mensajes»: no hay ninguna forma para «forzar» a «recibir mensajes», debe código de esa manera explícita (probable w/bucle). No hay manera de que otros hilos por la fuerza a hacer un hilo «recibir mensajes significaba para él», para lanzar mi primer sentencia en los términos que parecen preferir. Por CIERTO, Windows tiene un SuspendThread API (cont.)
    Para una solución específica, consulte msdn.microsoft.com/en-us/library/ms686345(VS.85).aspx — usted puede llamar a las Api de Windows directamente desde Python con ctypes o sourceforge.net/projects/pywin32 .

    OriginalEl autor Alex Martelli

  3. 2

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

    Para evitar el uso de las señales que usted podría utilizar un token passing sistema. Si desea hacer una pausa de la interfaz de usuario principal de la conversación que probablemente podría simplemente usar una Cola.Cola de objeto para comunicar con él.

    Sólo aparecerá un mensaje que indica el hilo de el sueño de una cierta cantidad de tiempo en la cola.

    Alternativamente, usted puede simplemente impulsar continuamente tokens en la cola de la interfaz de usuario principal de hilo. El trabajador sólo debe comprobar la cola de cada N segundos (0,2 o algo así). Cuando no hay tokens a la cola el subproceso de trabajo se bloque. Cuando se quiere iniciar de nuevo acaba de empezar a empujar las fichas en la cola desde el hilo principal de nuevo.

    No, usted no puede enviar señales a un hilo, solo para un proceso! Y signal.pause sólo significa que el proceso de llamada duerme hasta que se recibe una señal — no utilizar para el OP de la solicitud. Ver mi respuesta para el enfoque correcto.
    gracias por la aclaración. La señal de parte de mi respuesta fue una idea de último momento.. saludos 🙂

    OriginalEl autor dpn

  4. 2

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

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

    Sobre la wxPython canal de IRC, hemos tenido un par de becarios tratando de multiprocesamiento y se dijo que se trabajó. Por desgracia, todavía tengo que ver a alguien que ha escrito un buen ejemplo de multiprocesamiento y wxPython.

    Si usted (o alguien más aquí) vienen con algo, por favor, añadir a la wxPython la página de la wiki de los subprocesos aquí: http://wiki.wxpython.org/LongRunningTasks

    Es posible que desee comprobar que la página de independencia ya que cuenta con varios ejemplos interesantes uso de hilos y colas.

    OriginalEl autor Mike Driscoll

  5. 1

    Usted puede tomar un vistazo a la La API de Windows para el hilo de suspensión.

    Tan lejos como soy consciente de que no hay POSIX/pthread equivalente. Además, no puedo determinar si el hilo asas/IDs disponible desde Python. También hay problemas potenciales con Python, ya que su programación se realiza mediante el nativo de programador, es raro que se está a la espera de hilos para suspender, especialmente si los hilos suspendidos mientras se mantiene el GIL, entre otras posibilidades.

    OriginalEl autor Matt Joiner

Dejar respuesta

Please enter your comment!
Please enter your name here