Я пишу приложение 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
функция может быть то, что мне нужно Не могли бы вы немного рассказать об этом и добавить ответ, чтобы я мог принять его и поставить вам кредит после проверки? Благодарность!