1
resposta

[Projeto] Envio de notificações com ordem de prioridades de forma assíncrona

Achei a proposta bem confusa pela questão de ter uma ordem de prioridades a ser seguida, isto é, os VIPs devem receber notificações especiais antes de todos os outros, em seguida, os usuários comuns, etc. No começo fiquei questionei se faria diferença mesmo utilizar funções assíncronas, pois fiquei pensando se essa lógica não seria mais próxima de um código sequencial.

Mas após quebrar muito a cabeça, acredito ter contemplado a proposta.

import asyncio
import time

all_users = [
    {"nome": "Ana", "vip": True, "notificacoes_ativadas": True},
    {"nome": "João", "vip": False, "notificacoes_ativadas": True},
    {"nome": "Carla", "vip": False, "notificacoes_ativadas": False},
    {"nome": "Amélia", "vip": False, "notificacoes_ativadas": True},
    {"nome": "Lucas", "vip": False, "notificacoes_ativadas": True},
    {"nome": "Pedro", "vip": True, "notificacoes_ativadas": False},
    {"nome": "Marcos", "vip": True, "notificacoes_ativadas": True},
]

# Esse novo discionário irá armazenar os usuários com base em suas prioridades
all_users_sorted = {
    'priority_users': [],
    'common_users': [],
    'disabled_notify_users': []
}

# Função que classifica todos os usuários do discionário "all_users" com base em prioridade
async def sort_list():

    # Se deixar o asyncio.sleep e remover o time.sleep, e depois alternar, é possível notar a diferença.
    await asyncio.sleep(2) 
    # time.sleep(2)

    for user in all_users:
        if user['notificacoes_ativadas']:
            if user['vip']:
                all_users_sorted['priority_users'].append(user)
            else:
                all_users_sorted['common_users'].append(user)
        else:
            all_users_sorted['disabled_notify_users'].append(user)

# Função que envia as notificações com ordem de prioridade
async def send_notifications():

    # Se deixar o asyncio.sleep e remover o time.sleep, e depois alternar, é possível notar a diferença.
    await asyncio.sleep(2) 
    # time.sleep(2)

    for user in all_users_sorted['priority_users']:
        print(f'[VIP] Notificação especial enviada para {user['nome']}.')

    for user in all_users_sorted['common_users']:
        print(f'+ Notificação enviada para {user['nome']}.')

    for user in all_users_sorted['disabled_notify_users']:
        print(f'- {user['nome']} desativou as notificações.')
            
async def main():
    print("Enviando notificações...")
    task_1 = asyncio.create_task(sort_list())
    task_2 = asyncio.create_task(send_notifications())
    await asyncio.gather(task_1, task_2)
    print("Todas as notificações foram processadas!")

asyncio.run(main())
1 resposta

Oi, Lucas! Como vai?

Gostei bastante de como você estruturou a classificação dos usuários em diferentes listas de prioridade antes do envio das notificações. Isso ajuda a manter o fluxo mais organizado e facilita entender a lógica de quem recebe primeiro.

Uma dica interessante para o futuro é usar o método sorted() com lambda para ordenar diretamente com base em um critério, o que pode simplificar alguns casos:


usuarios = [
    {"nome": "Ana", "vip": True},
    {"nome": "Joao", "vip": False}
]

ordenados = sorted(usuarios, key=lambda u: not u["vip"])
print(ordenados)

Esse código organiza a lista colocando os VIPs primeiro, usando a chave booleana invertida.

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