Piszę aplikację Python + GObject, która po uruchomieniu musi odczytać nietrywialną ilość danych z dysku. Dane są odczytywane synchronicznie i zakończenie operacji odczytu zajmuje około 10 sekund, w tym czasie ładowanie interfejsu użytkownika jest opóźnione.
Chciałbym uruchomić zadanie asynchronicznie i otrzymać powiadomienie, gdy będzie gotowe, bez blokowania interfejsu użytkownika, mniej więcej tak:
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()
W przeszłości używałem GTask do tego typu rzeczy, ale martwię się, że jego kod nie został zmieniony od 3 lat, nie mówiąc już o przeniesieniu go do GObject Introspection. Co najważniejsze, nie jest już dostępny w Ubuntu 12.04. Szukam więc łatwego sposobu na asynchroniczne uruchamianie zadań, albo w standardowy sposób w Pythonie, albo w standardowy sposób GObject / GTK +.
Edycja: oto kod z przykładem tego, co próbuję zrobić. Próbowałem, python-defer
jak sugerowano w komentarzach, ale nie udało mi się uruchomić asynchronicznie długiego zadania i pozwolić, aby interfejs użytkownika ładował się bez konieczności oczekiwania na zakończenie. Przeglądaj kod testowy .
Czy istnieje prosty i szeroko stosowany sposób uruchamiania zadań asynchronicznych i otrzymywania powiadomień o ich zakończeniu?
async_call
funkcja może być tym, czego potrzebuję. Czy mógłbyś rozwinąć ją nieco i dodać odpowiedź, abym mógł ją zaakceptować i podziękować po przetestowaniu? Dzięki!