05-07-2017, 05:23 PM
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.
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.
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.
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.
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:
Un saludo.
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.
También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.