Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Sugestão] Resultados em um sistema de aposta

import asyncio
import random
import sys

# Garante que o terminal do Windows não trave com caracteres (caso use em outros projetos)
sys.stdout.reconfigure(encoding='utf-8')

jogos = [
    {"id": 1, "times": "Flamengo vs Palmeiras"},
    {"id": 2, "times": "São Paulo vs Corinthians"},
    {"id": 3, "times": "Grêmio vs Internacional"},
]

RESULTADOS = ["Vitória do Time A", "Vitória do Time B", "Empate"]

async def processar_jogo(jogo, future):
    tempo_espera = random.randint(2, 8)
    await asyncio.sleep(tempo_espera)
    
    # Sorteia o resultado base
    resultado_sorteado = random.choice(RESULTADOS)
    
    # Separa os nomes dos times usando o " vs " como divisor
    time_a, time_b = jogo["times"].split(" vs ")
    
    # Formata a string final do resultado com o nome real do time
    if resultado_sorteado == "Vitória do Time A":
        resultado_final = f"Vitória do {time_a}"
    elif resultado_sorteado == "Vitória do Time B":
        resultado_final = f"Vitória do {time_b}"
    else:
        resultado_final = "Empate"
        
    # Guarda o ID, o resultado formatado e o tempo no Future
    future.set_result({
        "id": jogo["id"], 
        "resultado_final": resultado_final, 
        "tempo": tempo_espera
    })

def exibir_resultado_imediatamente(future):
    dados = future.result()
    # Imprime o resultado exatamente no formato da imagem
    print(f"Aposta no jogo {dados['id']} definida: {dados['resultado_final']} (após {dados['tempo']}s).")

async def main():
    futures = []
    tarefas = []
    loop = asyncio.get_running_loop()

    for jogo in jogos:
        # Exibe a mensagem de registro individual para cada jogo
        print(f"Aposta no jogo {jogo['id']} ({jogo['times']}) registrada! Aguardando resultado...")
        
        future = loop.create_future()
        future.add_done_callback(exibir_resultado_imediatamente)
        futures.append(future)

        tarefa = asyncio.create_task(processar_jogo(jogo, future))
        tarefas.append(tarefa)

    # Adiciona uma linha em branco para separar os registros dos resultados
    print()

    await asyncio.gather(*tarefas)

    # Adiciona uma quebra de linha antes da mensagem final
    print("\nTodos os resultados foram revelados!")

if __name__ == "__main__":
    asyncio.run(main())
1 resposta
solução!

Oi, Marinaldo! Como vai?

Agradeço por compartilhar.

Você fez um bom uso de asyncio, Future e add_done_callback para exibir os resultados assim que cada jogo termina, deixando a simulação bem próxima de um sistema assíncrono real. Também ficou legal a troca de "Vitória do Time A" pelo nome real do time, pois melhora bastante a leitura do resultado.

Uma dica interessante para o futuro é testar o método asyncio.as_completed(), que permite lidar com as tarefas conforme elas forem finalizadas, sem precisar esperar a ordem em que foram criadas.


tarefas = [asyncio.create_task(processar_jogo(jogo)) for jogo in jogos]

for tarefa in asyncio.as_completed(tarefas):
    resultado = await tarefa
    print(resultado)

Esse código cria varias tarefas e mostra cada resultado assim que uma delas termina. Parabéns pela prática, seu código ficou bem organizado e mostra que você compreendeu bem a ideia de execução assíncrona.

Conteúdos relacionados
Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!