Estou escrevendo um aplicativo Python + GObject que precisa ler uma quantidade não trivial de dados do disco no início. Os dados são lidos de forma síncrona e leva cerca de 10 segundos para concluir a operação de leitura, período durante o qual o carregamento da interface do usuário é atrasado.
Gostaria de executar a tarefa de forma assíncrona e receber uma notificação quando estiver pronta, sem bloquear a interface do usuário, mais ou 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()
Eu usei o GTask no passado para esse tipo de coisa, mas estou preocupado que seu código não seja tocado em três anos, muito menos tenha sido portado para o GObject Introspection. Mais importante, ele não está mais disponível no Ubuntu 12.04. Portanto, estou procurando uma maneira fácil de executar tarefas de forma assíncrona, tanto no modo Python padrão quanto no GObject / GTK +.
Edit: aqui está um código com um exemplo do que estou tentando fazer. Tentei python-defer
conforme sugerido nos comentários, mas não consegui executar a tarefa longa de forma assíncrona e deixar a interface do usuário carregar sem ter que esperar a conclusão. Procure o código de teste .
Existe uma maneira fácil e amplamente usada de executar tarefas assíncronas e ser notificado quando elas terminarem?
async_call
função pode ser o que eu preciso. Você se importaria de expandir um pouco e adicionar uma resposta, para que eu possa aceitá-la e lhe creditar depois de testá-la? Obrigado!