Foros del Web » Programación para mayores de 30 ;) » Programación General »

Hilos, módulos y cómo manejarlos

Estas en el tema de Hilos, módulos y cómo manejarlos en el foro de Programación General en Foros del Web. Hola gente, Necesito algunas ideas sobre cómo hacer *bien* un proyecto en el que estoy trabajando. Intento crear una estructura de "componentes", es decir, que ...
  #1 (permalink)  
Antiguo 13/01/2010, 15:02
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Hilos, módulos y cómo manejarlos

Hola gente,
Necesito algunas ideas sobre cómo hacer *bien* un proyecto en el que estoy trabajando.
Intento crear una estructura de "componentes", es decir, que haya un módulo central que cargue y administre otros. Este módulo central no debe hacer nada más que cargar a los demás y recibir sus actualizaciones de estado. (en realidad luego será la base de la interfaz del sistema, pero no he llegado a ese punto aún)

Por otro lado, cada módulo a cargar debe ejecutar una acción cada cierto tiempo, sin molestar a los demás. Para esto no tengo inconvenientes, simplemente arranco un hilo diferente para cada uno, con un bucle tipo.
Código:
mientras no me tenga que detener:
   funcion()
   dormir (x segundos)
Ahora, también necesito poder llamar a funcion() directamente (quizás desde un botón en una ventana), y que se ejecute inmediatamente.
El problema es que si mi "módulo" es un hilo, y está ejecutando el bucle infinito (o durmiendo), no recibirá la petición de ejecutar la función, ¿o sí?.
Tampoco quiero crear dos hilos por módulo (uno para que el módulo no 'tranque' al módulo central, otro que periódicamente ejecute una función), parece excesivo

Pensé en crear un hilo que se encargue exclusivamente de ejecutar cada cierto tiempo las funciones correspondientes, pero surge un inconveniente más: si simplemente hago
Código:
mientras no me tenga que detener:
   funcion1()
   funcion2()
   ...
   funcionN()
   dormir (x segundos)
En realidad el hilo no se ejecutará cada x segundos sino cada x + la suma de los tiempos de ejecución de cada función, y ese tiempo puede ser demasiado (hay conexiones de red involucradas, y sabemos que eso puede demorar)

Estoy trabajando con Python, y hasta ahora tengo un módulo central que carga varias clases diferentes que descienden de Thread (un "módulo" es, entonces, un objeto de esa clase). Así logro que cada módulo pueda ejecutarse por separado, pero no me funciona para el otro requisito (la ejecución "directa")

¿Sugerencias?
  #2 (permalink)  
Antiguo 14/01/2010, 09:52
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Hilos, módulos y cómo manejarlos

he aquí el esqueleto básico del "sistema"

principal.py
Código Python:
Ver original
  1. # cargar configuración
  2. c = config.cargarConfig()
  3.  
  4. # iniciar carga y ejecución de componentes
  5. for componente in c:
  6.     c[componente]['mod'] = __import__(componente.lower())
  7.     c[componente]['mod'].iniciarComponente()

componente.py
Código Python:
Ver original
  1. class componente(threading.Thread):
  2.     def __obtenerSessID(self):
  3.     def __login(self):
  4.     def __obtener_grupos_usuario(self):
  5.     def __obtenerTickets(self):
  6.     def run(self):
  7.         self.__obtenerSessID()
  8.         self.__login()
  9.  
  10.         if self.__sesionActiva:
  11.             self.__grupos = self.__obtener_grupos_usuario()
  12.  
  13.             while not self.terminar:
  14.                 self.__obtenerTickets()
  15.                 time.sleep(intervalo)
  16.  
  17. #
  18. # Arrancando la clase (a nivel de módulo)...
  19. def iniciarComponente():
  20.     componente().start()

Entonces el problema descripto es que yo quiero poder hacer una llamada a __obtener_grupos_usuario() y obtener la respuesta sin interrumpir el hilo (o interrumpiéndolo, pero sin tener que "desechar" el objeto ya que no quiero tener que repetir las llamadas a __login() )

Etiquetas: hilos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:15.