es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Usando `async def` vs `def` en FastAPI y probando llamadas bloqueantes.

tl;dr

Como traductor de español que se especializa en documentos de TI, mi tarea consiste en traducir el siguiente texto al español sin traducir el código ni la salida en markdown.

  1. ¿Cuál de las opciones a continuación es el flujo de trabajo correcto en fastapi?
  2. ¿Cómo se prueba programáticamente si una llamada es realmente bloqueante (además de hacerlo manualmente desde el navegador)? ¿Hay alguna extensión de “prueba de estrés” para uvicorn o fastapi?

Tengo varios puntos finales en el servidor fastapi (actualmente usando uvicorn) que tienen llamadas bloqueadoras largas de código Python sincrónico normal. A pesar de la documentación (https://fastapi.tiangolo.com/async/), todavía no tengo claro si debería usar exclusivamente def, async def o mezclar ambas para mis funciones.

Hasta donde lo entiendo, tengo tres opciones, asumiendo que:
python
def some_long_running_sync_function():
...

Opción 1: use consistentemente def solo para puntos finales

@app.get("route/to/endpoint")
def endpoint<em>1:
  some</em>long<em>running</em>sync_function()

@app.post("route/to/another/endpoint")
def endpoint_2:
  ...

<h3>Opción 2: use consistentemente <code>async def</code> solamente y ejecute el código sincrónico bloqueador en el executor</h3>

<p>“`python
import asyncio

@app.get(“route/to/endpoint”)
async def endpoint1:
loop = asyncio.get
eventloop()
await loop.run
inexecutor(None, somelongrunningsync_function)

@app.post(“route/to/another/endpoint”)
async def endpoint_2:




Opción 3: mezclar def y async def según las llamadas subyacentes

```python import asyncio @app.get("route/to/endpoint") def endpoint<em>1: # el punto final está llamando al código sincrónico que no se puede esperar some</em>long<em>running</em>sync_function() @app.post("route/to/another/endpoint") async def endpoint_2: # este código se puede esperar, así que puedo usar async ...
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Respuestas

    1. El flujo de trabajo correcto en fastapi dependería del tipo de función que se esté llamando. Si la función es síncrona, se debe usar def para el punto final. Si es una función asíncrona, se debe usar async def para el punto final. Si la función es síncrona con IO de bloqueo, se debe usar async def y el IO de bloqueo se ejecutará en un executor usando loop.run_in_executor.
    2. Una forma de probar si una llamada es realmente de bloqueo es utilizando una herramienta de pruebas de carga como locust o JMeter. Actualmente no está disponible una extensión de prueba de estrés para uvicorn o fastapi.

Comments are closed.