Saltar a contenido

dorm.contrib.asyncguard

Surfaces llamadas ORM sync ejecutadas dentro de un event loop activo — el patrón bug que convierte una ruta async rápida en lenta porque cada otra request del worker queda bloqueada mientras la query sync se ejecuta.

El guard engancha pre_query y recorre el call stack: una llamada ORM sync dentro de una corrutina dispara la acción configurada ("warn" / "raise" / "raise_first"); las llamadas async a* legítimas pasan en silencio.

Cuándo activar

  • Tests / dev: "warn" (o "raise" para fallos duros) — pilla el bug en design time.
  • Producción: dejar desactivado. El stack walking en cada query tiene coste pequeño; mejor pagar en dev para no shippear el patrón.
# conftest.py — activar para todo el suite de tests
from dorm.contrib.asyncguard import enable_async_guard

def pytest_configure(config):
    enable_async_guard(mode="warn")

Modos

Modo Comportamiento
"warn" Un único WARNING por call site (deduplicado por template).
"raise" Raisea :class:SyncCallInAsyncContext en cada infractor.
"raise_first" Raisea una vez, luego degrada a "warn" para no inundar logs.

SyncCallInAsyncContext hereda de :class:BaseException así pasa por encima del except Exception de Signal.send y aflora como un 500 en vez de un warning loggeado-y-tragado.

API