A lógica do programa é que caso demore para verificar se o pagamento foi aprovado, esse intervalo de espera será aproveitado para já verificar também se tem o produto em estoque, após essas duas verificações terem sido feitas quase que simultâneas, é feito o balanço para saber se o produto foi confirmado ou não.
import asyncio
orders = [
{"id": 101, "pagamento_aprovado": True, "estoque_disponivel": True},
{"id": 102, "pagamento_aprovado": True, "estoque_disponivel": False},
{"id": 103, "pagamento_aprovado": False, "estoque_disponivel": True},
{"id": 104, "pagamento_aprovado": True, "estoque_disponivel": True},
{"id": 105, "pagamento_aprovado": False, "estoque_disponivel": False},
]
async def check_payment(order):
await asyncio.sleep(3)
if order['pagamento_aprovado']:
print(f'PEDIDO #{order['id']} > [OK] Pagamento aprovado.')
return True
else:
print(f'PEDIDO #{order['id']} > [NOT_OK] Pagamento recusado para esse pedido.')
return False
async def check_stock(order):
await asyncio.sleep(3)
if order['estoque_disponivel']:
print(f'PEDIDO #{order['id']} > [OK] Estoque disponível.')
return True
else:
print(f'PEDIDO #{order['id']} > [NOT_OK] Estoque indisponível para esse produto.')
return False
async def manage_orders(order):
print(f'\nPEDIDO #{order['id']} > Processando pedido...')
payment_successful, has_stock = await asyncio.gather(
check_payment(order),
check_stock(order)
)
if payment_successful:
if has_stock:
print(f'PEDIDO #{order['id']} > [SUCESS] Pedido confirmado! Enviado para entrega.')
else:
print(f'PEDIDO #{order['id']} > [NOT_SUCESS] Pedido cancelado!')
else:
print(f'PEDIDO #{order['id']} > [NOT_SUCESS] Pedido cancelado!')
async def main():
for order in orders:
await manage_orders(order)
print('\nTodos os pedidos foram processados!\n')
asyncio.run(main())