Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

514
Views
¿Cómo fastapi/uvicorn paraleliza las solicitudes?

Hice un experimento con fastapi y uvicorn cuyo resultado no entiendo.

en el código

 @app.get('/loadtest') def root(): time.sleep(1) return {'message': 'hello'}

corriendo en docker con

 CMD ["uvicorn", "app.main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"]

Hice la siguiente prueba:

 ab -c 100 -n 1000 localhost/loadtest

lo que me da los resultados:

 bersling-2:cas bersling$ ab -c 100 -n 1000 localhost/loadtest This is ApacheBench, Version 2.3 <$Revision: 1879490 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking localhost (be patient) Completed 100 requests Completed 200 requests Completed 300 requests Completed 400 requests Completed 500 requests Completed 600 requests Completed 700 requests Completed 800 requests Completed 900 requests Completed 1000 requests Finished 1000 requests Server Software: uvicorn Server Hostname: localhost Server Port: 80 Document Path: /loadtest Document Length: 19 bytes Concurrency Level: 100 Time taken for tests: 85.052 seconds Complete requests: 1000 Failed requests: 0 Total transferred: 163000 bytes HTML transferred: 19000 bytes Requests per second: 11.76 [#/sec] (mean) Time per request: 8505.191 [ms] (mean) Time per request: 85.052 [ms] (mean, across all concurrent requests) Transfer rate: 1.87 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.7 0 4 Processing: 1008 7964 1419.3 8010 9022 Waiting: 1004 7963 1419.3 8008 9020 Total: 1008 7965 1418.7 8010 9024 Percentage of the requests served within a certain time (ms) 50% 8010 66% 8016 75% 8988 80% 8989 90% 8993 95% 8998 98% 9003 99% 9006 100% 9024 (longest request)

Así que vemos que esto tarda alrededor de 100 segundos en completarse. Sin embargo, habría esperado 1000, ya que asumiría que las solicitudes deben trabajarse secuencialmente y cada solicitud toma un segundo. Asumí la cola secuencial porque pensé que Python solo puede manejar una solicitud a la vez (en modo síncrono) y no estoy al tanto de que uvicorn generaría múltiples procesos o subprocesos. Entonces, no entiendo cómo es posible el resultado de 100 en lugar del resultado de 1000. ¿Puede alguien por favor explicar?

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

Para citar los documentos :

Cuando declara una función de operación de ruta con definición normal en lugar de definición asíncrona, se ejecuta en un subproceso externo que luego se espera, en lugar de llamarse directamente (ya que bloquearía el servidor).

O para citar la respuesta de la discusión de github, que es un poco más simple de leer:

Para los puntos finales definidos con def (no async def), FastAPI los ejecutará en un grupo de subprocesos, exactamente como para evitar bloquear el servidor y permitir que se atiendan varias solicitudes en paralelo.

Lo que luego plantea la cuestión de la cantidad de subprocesos concurrentes y cómo se puede controlar. Esta pregunta se aborda aquí .

Por conveniencia de nuevo la cita:

fastAPI se basa en starlette que se usa para controlar ThreadPoolExecutor, pero starlette ahora usa anyio, por lo que no veo una mejor manera que su propuesta:

RunVar("_default_thread_limiter").set(CapacityLimiter(2))

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!