Olá!
Contexto
Abaixo segue a minha solução para o exercício 07 (que pode ser vista aqui também). A única diferença significativa, ao meu ver, é o uso do método task.done() o qual eu não conhecia.
A priori, tive dificuldade em entender quando eu faria a chamada asyncio.gather(...) e estava insistindo em fazê-la antes do laço de repetição. Obviamente o programa não executava como esperado, finalizando sem verificar o status das tarefas (ou melhor, as tarefas sempre que eram verificadas - apenas 1 vez - já estavam com o status de concluída).
Na minha interpretação inicial a chamada asyncio.gather(...) era responsável por executar efetivamente as tasks e colocá-la após o loop não faria sentido pois o programa ficaria preso no loop eternamente. Obviamente isso provou-se falso, uma vez que descobri que a chamada asyncio.create_task(...) difere de somente atribuir a corotina a uma variável e depois "chamá-la" com await pelo fato de que o asyncio.create_task(...) já agenda ela para execução juntamente com o event loop somente aguardando uma oportunidade para executá-la (assim que o event loop volutariamente ceder o controle através de uma chamada await como no caso do await asyncio.sleep(1) dentro do loop while).
Pelas minhas pesquisas, o asyncio.gather(...) é responsável por esperar tarefas terminarem, coletar resultados, propagar exceções atuando como se fosse uma espécie de ""formalização do encerramento das tasks".
Assim, acredito eu, que tenha desvendado o "mistério" da execução correta do gabarito, rsrsrsrs.
Dúvida
Depois desse resumo, o meu entendimento está correto? Falta alguma informação importante pra fechar o quadro do motivo pelo qual no gabarito, asyncio.gather(...) seja executado após o loop?
async def exerc_07() -> None:
"""
DESCRIPTION GOES HERE
"""
async def processing_data(base_delay: int, index: int) -> None:
delay: int = base_delay + ((index + 1) * random.uniform(1.0, 2.0))
await asyncio.sleep(delay)
results[index] = True
print(f'{colored(f"[ALURA_ASYNC][07][{datetime.now().strftime('%H:%M:%S')}][{delay}]", "white", attrs=CGATTRS)} finished task: {colored(index, "red", attrs=CGATTRS)}')
print(f'{colored("[ALURA_ASYNC][07]", "white", attrs=CGATTRS)} --- EXERCISE ---')
results: List[bool] = [False, False, False]
task_01: asyncio.Task = asyncio.create_task(processing_data(base_delay=3, index=0))
task_02: asyncio.Task = asyncio.create_task(processing_data(base_delay=5, index=1))
task_03: asyncio.Task = asyncio.create_task(processing_data(base_delay=7, index=2))
while True:
if all(results):
print(f'{colored("[ALURA_ASYNC][07]", "white", attrs=CGATTRS)} ALL TASKS FINISHED!! Status: {colored(results, "red", attrs=CGATTRS)}')
break
print(f'{colored("[ALURA_ASYNC][07]", "white", attrs=CGATTRS)} status: {colored(results, "red", attrs=CGATTRS)}')
await asyncio.sleep(1)
await asyncio.gather(task_01, task_02, task_03)
print(f'{colored("[ALURA_ASYNC][07]", "white", attrs=CGATTRS)} --- FINISH ---')