1
resposta

[Projeto] Inscrições em cursos com funções assíncronas

import asyncio

courses = {
    "Python Avançado": {"vagas": 2, "inscritos": []},
    "Java para Iniciantes": {"vagas": 1, "inscritos": []},
    "Machine Learning": {"vagas": 0, "inscritos": []},
}

students = [
    {"nome": "Alice", "curso": "Python Avançado"},
    {"nome": "Bruno", "curso": "Java para Iniciantes"},
    {"nome": "Alice", "curso": "Python Avançado"}, # Tentativa de inscrição duplicada
    {"nome": "Daniela", "curso": "Machine Learning"},
    {"nome": "Carlos", "curso": "Java para Iniciantes"},
    {"nome": "Lucas", "curso": "Python Avançado"} 
]

async def check_diponibility(student):
    await asyncio.sleep(2)

    if courses[student['curso']]['vagas'] > 0:
        print(f'\n{student['nome']} > [OK] Ainda há disponibilidade de vagas para o curso {student['curso']} (Vagas: {courses[student['curso']]['vagas']}).')
        return True
    else:
        print(f'\n{student['nome']} > [NOT_OK] Turmas encerradas para o curso {student['curso']} (Vagas: {courses[student['curso']]['vagas']}).')
        return False

async def check_duplicate_register(student):
    await asyncio.sleep(2)

    if not student['nome'] in courses[student['curso']]['inscritos']:
        print(f'{student['nome']} > [OK] Ainda não há registro desse aluno no curso {student['curso']}.')
        return False
    else:
        print(f'{student['nome']} > [NOT_OK] Esse aluno já está registrado no curso {student['curso']}.')
        return True

async def register_on_course(student):

    has_disponibility, has_duplicate_register = await asyncio.gather(
        check_diponibility(student),
        check_duplicate_register(student)
        )
    
    if has_disponibility:
        if not has_duplicate_register:
            courses[student['curso']]['inscritos'].append(student['nome'])
            courses[student['curso']]['vagas'] -= 1
            print(f'{student['nome']} > [SUCESS] Inscrição realizada com sucesso no curso {student['curso']}.')
        else:
            print(f'{student['nome']} > [NOT_SUCESS] A inscrição não foi realizada.')
    else:
        print(f'{student['nome']} > [NOT_SUCESS] A inscrição não foi realizada.')
        
async def main():
    print('\nIniciando inscrições...')
    for student in students:
        await register_on_course(student)
    print('\nTodas as inscrições foi realizadas!\n')

asyncio.run(main())
1 resposta

Oi, Lucas! Como vai?

Gostei que você utilizou asyncio.gather pra executar verificações de forma paralela, deixando o fluxo mais rápido. Notei que na função check_diponibility há um pequeno erro de digitação no nome, o que pode gerar confusão na manutenção do código.

Continue firme nos estudos.

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