1
resposta

[Dúvida] Esta conforme ?

import asyncio

QTD_REMETENTES = 4

lista = []

async def lista_remetentes():
    for _ in range(QTD_REMETENTES):
        nome = input("Digite o nome do remetente: ").capitalize()

        while True:
            nivel = input("Digite o nivel do remetente: ").lower()
            if nivel in ["vip", "normal", "desativado"]:
                break
            else:
                print("Nivel invalido. Tente novamente.")

        lista.append({
            "nome": nome,
            "nivel": nivel
        })

async def notificar():
    print("Enviando Notificacoes....")
    await asyncio.sleep(2)
    print("Notificaçoes foram enviadas para os remetentes")

async def notificar_vip():
    await asyncio.sleep(4)
    for i in lista:
        if i["nivel"] == "vip":
            print("Notificaçoes VIPs eviadas para o remetentes VIPs: {}".format(i["nome"]))

async def notificar_normal():
    await asyncio.sleep(4)
    for i in lista:
        if i["nivel"] == "normal":
            print("Notificaçoes Normais foram enviadas para os remetentes Normais: {}".format(i["nome"]))

async def notificao_desativada():
    await asyncio.sleep(4)
    for i in lista:
        if i["nivel"] == "desativado":
            print("{} desativou as notificações. Nada foi enviado.".format(i["nome"]))

async def main():
    await asyncio.gather(
        lista_remetentes(),
        notificar(),
        notificar_vip(),
        notificar_normal(),
        notificao_desativada()
    )

asyncio.run(main())
1 resposta

Oi, Samuel! Como vai?

Agradeço por compartilhar.

A sua ideia tá bem alinhada com a atividade: você valida o nivel (vip/normal/desativado), guarda tudo em uma lista e separa as notificações por tipo. Um ponto que chamou atenção é que lista_remetentes() usa input(), que é bloqueante; então, mesmo com asyncio.gather, o preenchimento da lista pode segurar o fluxo e as outras tarefas acabam não ficando tão “concorrentes” quanto parece.

Uma dica interessante para o futuro é usar asyncio.to_thread() para rodar leituras bloqueantes em uma thread, mantendo o loop assíncrono mais fluido. Veja este exemplo:


import asyncio

async def ler_nome():
    nome = await asyncio.to_thread(input, "Digite o nome: ")
    return nome.strip().capitalize()

async def main():
    nome = await ler_nome()
    print(f"Nome recebido: {nome}")

asyncio.run(main())

Esse código usa asyncio.to_thread pra executar o input fora do loop de eventos, evitando travar outras tarefas assíncronas enquanto o usuário digita.

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