Я пишу програму Python + GObject, якій потрібно прочитати нетривіальну кількість даних з диска при запуску. Дані зчитуються синхронно, і для завершення операції зчитування потрібно близько 10 секунд, протягом цього часу завантаження інтерфейсу затримується.
Я хотів би виконати завдання асинхронно і отримувати сповіщення, коли воно буде готове, не блокуючи інтерфейс користувача, більш-менш схоже:
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()
Раніше я використовував GTask для подібних речей, але я стурбований тим, що його код не торкнувся протягом 3 років, не кажучи вже про перенесене на GObject Introspection. Найголовніше, що він більше не доступний в Ubuntu 12.04. Тому я шукаю простий спосіб запустити завдання асинхронно, або стандартним способом Python, або стандартним способом GObject / GTK +.
Редагувати: ось якийсь код із прикладом того, що я намагаюся зробити. Я спробував, python-defer
як було запропоновано в коментарях, але мені не вдалося виконати довге завдання асинхронно і дозволити завантажувати інтерфейс користувача, не дочекавшись його завершення. Перегляньте тестовий код .
Чи є простий і широко застосовуваний спосіб виконання асинхронних завдань та отримання сповіщення про їх закінчення?
async_call
функція може бути те, що мені потрібно. Не хотіли б ви трохи розширити його і додати відповідь, щоб я міг прийняти його та зарахувати вас після тестування? Спасибі!