Estoy escribiendo una aplicación Python + GObject que necesita leer una cantidad no trivial de datos del disco al inicio. Los datos se leen sincrónicamente y se tarda unos 10 segundos en finalizar la operación de lectura, tiempo durante el cual la carga de la IU se retrasa.
Me gustaría ejecutar la tarea de forma asincrónica y recibir una notificación cuando esté lista, sin bloquear la interfaz de usuario, más o menos como:
def take_ages():
read_a_huge_file_from_disk()
def on_finished_long_task():
print "Finished!"
run_long_task(task=take_ages, callback=on_finished_long_task)
load_the_UI_without_blocking_on_long_task()
He usado GTask en el pasado para este tipo de cosas, pero me preocupa que su código no haya sido tocado en 3 años, y mucho menos haya sido portado a GObject Introspection. Lo más importante, ya no está disponible en Ubuntu 12.04. Por lo tanto, estoy buscando una manera fácil de ejecutar tareas de forma asincrónica, ya sea en una forma estándar de Python o en una forma estándar GObject / GTK +.
Editar: aquí hay un código con un ejemplo de lo que estoy tratando de hacer. He intentado python-defer
como se sugiere en los comentarios, pero no pude ejecutar la tarea larga de forma asincrónica y dejar que la interfaz de usuario se cargue sin tener que esperar a que termine. Explore el código de prueba .
¿Existe una manera fácil y ampliamente utilizada de ejecutar tareas asincrónicas y recibir notificaciones cuando hayan terminado?
async_call
función podría ser lo que necesito. ¿Te importaría expandirlo un poco y agregar una respuesta, para que pueda aceptarlo y acreditarte después de probarlo? ¡Gracias!