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