alternativa al tiempo de python.

Realizo el procesamiento + visualización de datos en tiempo real, y llego a nuestra base de datos cada 60 segundos. Me gustaría no usar time.sleep() para esperar cada 60 segundos, ya que me quita el control (es decir, el acceso REPL a las variables, que no es necesario pero agradable) y congela los gráficos de matplotlib.

¿Hay alguna alternativa? Idealmente, algo que inicialmente le daría el control al usuario, y luego de 60 segundos, le quitaría el control, ejecutaría un código y actualizaría una ttwig, luego le devolvería el control al usuario. (Cuando digo control, me refiero a control REPL).

¿Algunas ideas?

Si no necesita quitar el control del usuario, hay una manera muy fácil de hacer esto: crear un threading.Timer .

Lo que quiere hacer es tomar la “continuación” de la función, es decir, todo lo que vendría después de la time.sleep y trasladarla a una función my_function separada, luego progtwigrla de la siguiente manera:

 threading.Timer(60, my_function).start() 

Y al final de my_function , progtwig un nuevo Timer con exactamente la misma línea de código.

Timer es una interfaz y una implementación bastante torpes, pero está integrado en el stdlib. Puede encontrar recetas en ActiveState y módulos en PyPI que proporcionan mejores clases que, por ejemplo, ejecutan múltiples temporizadores en un hilo en lugar de un hilo por temporizador, le permiten progtwigr llamadas recurrentes para que no tenga que reprogtwigrse, etc. Pero para algo que se ejecuta cada 60 segundos, creo que puede estar bien con el Timer .

Una cosa a tener en cuenta: si el trabajo en segundo plano necesita tratar con cualquiera de los mismos datos que el usuario está tratando en el REPL, existe la posibilidad de una condición de carrera. A menudo, en un entorno interactivo (especialmente en Python, gracias a la GIL), puede imponerle al usuario la responsabilidad de no causar ninguna carrera. Si no, necesitarás algún tipo de sincronización.

Otra cosa a tener en cuenta: si está tratando de hacer un trabajo de GUI, dependiendo de la GUI que esté usando (creo que matplotlib es configurable pero por defecto es tkinter ?), Es posible que no pueda actualizar la GUI desde un segundo plano. hilo.

Pero en realidad hay una mejor solución en ese caso de todos modos. Los progtwigs de GUI tienen un bucle de eventos que se ejecuta en un hilo u otro, y casi todos los bucles de eventos que se hayan diseñado tienen una forma de progtwigr un temporizador en ese hilo. Para tkinter , si tiene un identificador para el objeto root , simplemente llame a root.after(60000, my_function) lugar de threading.Timer(60, my_function).start() , y se ejecutará en el mismo hilo que la GUI, Y sin desperdiciar ningún recurso innecesario.