1
resposta

[Sugestão] Gerenciando inscrições em cursos

import asyncio

# Base de dados
cursos = {
    "Python Avançado": {"vagas": 2, "inscritos": [], "lock": asyncio.Lock()},
    "Java para Iniciantes": {"vagas": 1, "inscritos": [], "lock": asyncio.Lock()},
    "Machine Learning": {"vagas": 0, "inscritos": [], "lock": asyncio.Lock()},
}

alunos = [
    {"nome": "Alice", "curso": "Python Avançado"},
    {"nome": "Bruno", "curso": "Python Avançado"},
    {"nome": "Carlos", "curso": "Java para Iniciantes"},
    {"nome": "Daniela", "curso": "Machine Learning"},
    {"nome": "Alice", "curso": "Python Avançado"},  # Tentativa duplicada
]

async def realizar_inscricao(aluno, curso_nome):
    curso = cursos[curso_nome]
    
    # O bloco 'async with' garante que apenas UM por vez mexa neste curso especifico
    async with curso["lock"]:
        # Simula uma pequena demora de processamento (0.1s)
        await asyncio.sleep(0.1)
        
        # 1. Verificar duplicidade
        if aluno in curso["inscritos"]:
            print(f"[-] Erro: {aluno} ja esta inscrito em {curso_nome}.")
            return

        # 2. Verificar vagas
        if curso["vagas"] > 0:
            # 3. Confirmar e reduzir vaga (Operacao Atomica)
            curso["inscritos"].append(aluno)
            curso["vagas"] -= 1
            print(f"[+] Sucesso: {aluno} inscrito no curso {curso_nome}.")
        else:
            # 4. Notificar falta de vagas
            print(f"[!] Erro: Nao ha vagas para {aluno} no curso {curso_nome}.")

async def main():
    print("Iniciando sistema de inscricoes seguro...\n")
    
    # Criamos as tarefas para todos os alunos
    tarefas = [realizar_inscricao(a["nome"], a["curso"]) for a in alunos]
    
    # Executamos todos simultaneamente
    await asyncio.gather(*tarefas)
    
    print("\n--- Relatorio Final ---")
    for nome, info in cursos.items():
        print(f"{nome}: {len(info['inscritos'])} inscritos | {info['vagas']} vagas restantes")

if __name__ == "__main__":
    asyncio.run(main())
1 resposta

Olá, Marinaldo! Como vai?

Parabéns pela resolução da atividade!

Observei que você explorou o uso do asyncio.Lock para garantir exclusividade de acesso com Python, utilizou muito bem o asyncio.gather para executar tarefas simultâneas e ainda compreendeu a importância da verificação de duplicidade para manter a consistência dos dados.

Continue postando as suas soluções, com certeza isso ajudará outros estudantes e tem grande relevância para o fórum.

Fico à disposição! E se precisar, conte sempre com o apoio do fórum.

Abraço e bons estudos!

AluraConte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!