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())