Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Condicionar un Hilo desde otro Hilo con Threat
#2
Hola, ¿cómo estás?

Efectivamente threading.Event es la forma correcta de realizar el tipo de sincronización que estás buscando. Únicamente te está faltando escribir y leer su valor en los hilos correspondientes. Para que sea más claro, te recomiendo que llames al evento detener_numeros.

Código:
if __name__ == "__main__" :
   detener_numeros = threading.Event()

   hilo1 = threading.Thread(target=letras, args=(detener_numeros,))  
   hilo2 = threading.Thread(target=numeros, args=(detener_numeros,))

Ahora bien, un evento puede tener dos estados: desactivado/apagado/falso (que es el valor inicial) o activado/encendido/verdadero. De modo que en el lugar en donde quieres detener el hilo "números", vamos a establecer el valor de "activado" vía la función Event.set.

Código:
def letras(detener_numeros):
   abecedario = ['a','b','c','d','e','f','g','h','i','j']

   for i in range(len(abecedario)):
       if abecedario[i] == 'c':
           # Aqui es donde quiero detener el otro hilo "numeros" durante
           # unos 5 segundos
           detener_numeros.set()
       else:
           print abecedario[i]
       time.sleep(1)

Y en el otro hilo, vamos a chequear periódicamente el valor del evento para que, en caso de estar activado, suspendamos la ejecución por 5 segundos.

Código:
def numeros(detener_numeros):
   numbers= [1,2,3,4,5,6,7,8,9,10]

   for j in range(len(numbers)):
       if detener_numeros.is_set():
           print "Detenido."
           time.sleep(5)
           detener_numeros.clear()
       print numbers[j]
       time.sleep(1)

Una vez transcurridos los 5 segundos, restablecemos el valor del evento vía Event.clear() para que no vuelva a suspenderse en la próxima iteración.

Te comento otros dos problemas que observé en tu código. Primero, al ejecutar los hilos como daemon = True no estás esperando a que finalicen, por lo que tu script termina inmediatamente luego de lanzar los hilos. Debes esperar a que terminen vía la función Thread.join.

Código:
if __name__ == "__main__" :
   detener_numeros = threading.Event()

   hilo1 = threading.Thread(target=letras, args=(detener_numeros,))  
   hilo2 = threading.Thread(target=numeros, args=(detener_numeros,))

   hilo1.start()
   hilo2.start()

   hilo1.join()
   hilo2.join()

Por otro lado, veo que estás usando tres espacios para delimitar los bloques de tu código. Lo recomendado es siempre usar 4 espacios (seguramente puedas configurar esto desde tu IDE).

El código completo sería:

Código:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import threading
import time


def letras(detener_numeros):
    abecedario = ['a','b','c','d','e','f','g','h','i','j']

    for i in range(len(abecedario)):
        if abecedario[i] == 'c':
            # Aqui es donde quiero detener el otro hilo "numeros" durante
            # unos 5 segundos
            detener_numeros.set()
        else:
            print abecedario[i]
        time.sleep(1)


def numeros(detener_numeros):
    numbers= [1,2,3,4,5,6,7,8,9,10]

    for j in range(len(numbers)):
        if detener_numeros.is_set():
            print "Detener."
            time.sleep(5)
            detener_numeros.clear()
        print numbers[j]
        time.sleep(1)


if __name__ == "__main__" :
    detener_numeros = threading.Event()

    hilo1 = threading.Thread(target=letras, args=(detener_numeros,))  
    hilo2 = threading.Thread(target=numeros, args=(detener_numeros,))

    hilo1.start()
    hilo2.start()

    hilo1.join()
    hilo2.join()


Un saludo.
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder


Mensajes en este tema
RE: Condicionar un Hilo desde otro Hilo con Threat - por Francisco - 05-07-2017, 05:23 PM

Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)