Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Projeto] Gerenciamento de pedidos com funções assíncronas

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())
1 resposta
solução!

Oi, Lucas! Como vai?

Achei muito interessante como você utilizou asyncio.gather() para rodar as verificações de pagamento e estoque de forma assíncrona. Isso torna o processo mais rápido, já que as duas tarefas acontecem praticamente ao mesmo tempo.

Muito obrigada por compartilhar com a gente.

Alura

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