Sto scrivendo un'app Python + GObject che deve leggere una quantità non banale di dati dal disco all'avvio. I dati vengono letti in modo sincrono e sono necessari circa 10 secondi per completare l'operazione di lettura, durante il quale il caricamento dell'interfaccia utente viene ritardato.
Vorrei eseguire l'attività in modo asincrono e ricevere una notifica quando è pronta, senza bloccare l'interfaccia utente, più o meno come:
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()
Ho usato GTask in passato per questo genere di cose, ma temo che il suo codice non sia stato toccato da 3 anni, per non parlare del porting su GObject Introspection. Ancora più importante, non è più disponibile in Ubuntu 12.04. Quindi sto cercando un modo semplice per eseguire le attività in modo asincrono, in modo Python standard o in modo GObject / GTK + standard.
Modifica: ecco un po 'di codice con un esempio di ciò che sto cercando di fare. Ho provato python-defer
come suggerito nei commenti, ma non sono riuscito a eseguire il task lungo in modo asincrono e lasciare caricare l'interfaccia utente senza dover attendere che finisca. Sfoglia il codice di prova .
Esiste un modo semplice e ampiamente utilizzato per eseguire attività asincrone e ricevere notifiche al termine?
async_call
funzione potrebbe essere quella di cui ho bisogno. Ti dispiacerebbe ampliarlo un po 'e aggiungere una risposta, in modo che io possa accettarlo e accreditarti dopo averlo testato? Grazie!