Skip to main content

NanoWait 7.2

Esperas previsíveis e retries resilientes para automação Python.

O NanoWait reúne espera adaptativa, polling de condições e execução com retentativas em uma API pequena. A versão 7.2 acrescenta backoff exponencial, jitter e limite de intervalo ao executor execute(). Esses recursos reduzem rajadas de requisições quando uma API, conexão ou serviço externo oscila.

Instalação

pip install nano-wait

Para desenvolvimento:

pip install nano-wait[dev]

O suporte opcional à leitura de sinal Wi-Fi continua disponível em plataformas compatíveis:

pip install nano-wait[wifi]

Uso rápido

from nano_wait import wait, wait_until

wait(2)                         # nunca fica abaixo de 2 segundos
wait(2, smart=True)             # pode ser menor quando for apenas uma cortesia
wait(lambda: page.is_loaded(), timeout=10)
wait_until(
    lambda: api_is_ready(),
    timeout=15,
    msg="A API não ficou pronta",
)

Retry para rede instável

Use execute() quando uma operação pode falhar temporariamente. Por padrão, o intervalo cresce após cada falha, recebe uma pequena variação aleatória e não ultrapassa max_interval.

import requests
from nano_wait import execute

result = execute(
    lambda: requests.get(url, timeout=3).json(),
    timeout=30,
    interval=0.5,
    backoff=2.0,
    max_interval=8.0,
    jitter=0.20,
    max_attempts=8,
    expected_exceptions=(requests.RequestException,),
)

if result.success:
    payload = result.result
else:
    result.raise_if_failed()

A sequência de espera do exemplo cresce aproximadamente como 0.5s, 1s, 2s, 4s e 8s. O jitter evita que várias instâncias que falharam juntas repitam simultaneamente. O timeout é total e inclui a execução da função e os intervalos entre tentativas.

Parâmetros de execute

Parâmetro Padrão Finalidade
fn — Função sem argumentos a executar.
timeout 10.0 Tempo total máximo em segundos.
interval 0.2 Intervalo inicial entre tentativas.
backoff 2.0 Multiplicador do intervalo a cada falha; deve ser >= 1.
max_interval 30.0 Teto do intervalo calculado.
jitter 0.1 Variação aleatória entre 0 e o percentual informado.
max_attempts None Limite opcional de tentativas.
expected_exceptions (Exception,) Exceções transitórias que podem ser capturadas.
on_error None Callback chamado como on_error(exception, attempt).
profile None Perfil NanoWait usado durante a espera.
smart True Adapta o intervalo ao estado do sistema.

Retornos truthy e o valor 0 representam sucesso. Outros retornos falsy geram nova tentativa. Exceções que não pertençam a expected_exceptions não são escondidas.

Espera síncrona

from nano_wait import wait

wait(1.5)
wait(1.5, speed="fast")
wait(1.5, profile="safe")
report = wait(1.5, explain=True)

No modo padrão (smart=False), wait(t) preserva um piso real de t segundos. O sistema pode aumentar a espera quando estiver sobrecarregado. No modo smart=True, a espera pode ser reduzida quando o sistema estiver saudável.

Espera assíncrona

import asyncio
from nano_wait import wait_async

async def main():
    await wait_async(1, smart=True)
    await wait_async(lambda: check_ready(), timeout=10)

asyncio.run(main())

A função assíncrona usa asyncio.sleep() e executa condições síncronas em uma thread para não bloquear o event loop.

Polling e timeout

from nano_wait import wait_until, WaitTimeoutError

try:
    wait_until(
        lambda: driver.title == "Home",
        timeout=15,
        msg="A página Home não carregou",
    )
except WaitTimeoutError as error:
    print(error)

wait(condition) retorna True quando a condição é satisfeita e False quando o timeout termina. Com raise_on_timeout=True, ele lança WaitTimeoutError.

Decorator de retry

O decorator usa o mesmo motor resiliente de execute().

from nano_wait import retry

@retry(
    timeout=30,
    interval=0.5,
    backoff=2,
    max_attempts=6,
    max_interval=10,
    jitter=0.15,
)
def fetch_data():
    return client.fetch()

result = fetch_data()
if result.success:
    print(result.result)

O decorator retorna ExecutionResult, permitindo consultar success, result, attempts, duration e error.

Perfis

Perfil Uso recomendado
ci Pipelines rápidos e execução contínua.
testing Testes locais e QA.
default Uso geral.
rpa Automação de interfaces lentas.
turbo Cortesia mínima entre ações.
safe Hardware fraco, serviços lentos e conexões frágeis.
wait(2, profile="safe")
execute(fetch_data, profile="safe", timeout=30)

Utilitários de rede

from nano_wait import has_internet

if has_internet(timeout=1):
    execute(fetch_data, timeout=20)
else:
    wait(2, profile="safe")

has_internet() faz uma tentativa simples de conexão TCP. Ela é um diagnóstico pontual, não uma garantia de que uma API específica esteja disponível. Para a operação real, prefira execute() com expected_exceptions restrito às exceções de rede da biblioteca cliente.

Aprendizado e telemetria

O NanoWait mantém um ajuste de aprendizado por perfil em ~/.nano_wait_learning.json. Esse ajuste influencia esperas adaptativas, mas não remove o piso de wait(t) no modo padrão. Telemetria e explicações podem ser ativadas pelas opções da API.

Migração da versão 7.1

Nenhuma chamada existente precisa ser alterada. O comportamento anterior de execute() continua disponível com interval, timeout, max_attempts, on_error e expected_exceptions. Para aproveitar a melhoria, adicione backoff, max_interval e jitter.

A versão também corrige um caso em que o aprendizado acumulado ou um perfil agressivo podia fazer wait(t) ficar abaixo do valor solicitado apesar da garantia documentada.

Desenvolvimento e testes

pytest -q

A versão 7.2 inclui testes para crescimento de backoff, jitter configurável, limite de tentativas, validação de parâmetros e propagação de exceções inesperadas.

Licença

Este projeto é distribuído sob a licença MIT. Consulte LICENSE.

Metadata

Release files for nano-wait 7.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for nano-wait 7.2.0
File Size Uploaded Provenance Actions
nano_wait-7.2.0.tar.gz 29.7 kB Without provenance Details for nano_wait-7.2.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for nano-wait 7.2.0
File Interpreter ABI Platform Actions
nano_wait-7.2.0-py3-none-any.whl Python 3 none any Details for nano_wait-7.2.0-py3-none-any.whl

Total release size: 62.3 kB

Release files / nano_wait-7.2.0.tar.gz

Download URL nano_wait-7.2.0.tar.gz
Size 29.7 kB
Tags Source
SHA-256 checksum
How to use checksums
3419ca0908aa654c7ceccaeffeed03025481870b9fbf995ebef3b40b24c050cd
BLAKE2b-256 checksum
How to use checksums
49991d6f93fc5604543a53227c65c879b7381db3029a544defe314430dd3a7ef
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.4

Release files / nano_wait-7.2.0-py3-none-any.whl

Download URL nano_wait-7.2.0-py3-none-any.whl
Size 32.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
89eba9df634948afb51946ed25a50591e6008935d37394fe1dc2956495cadbe3
BLAKE2b-256 checksum
How to use checksums
6f0944bbd4f0fd43eb4ad4d89ff1f1b149e60485c299f2b2a4a4ddac3536c7d1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.4

Security for nano-wait 7.2.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

7.2.0 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page