Actualmente estoy desarrollando un servicio en Django que hace uso de una API externa lenta (tarda alrededor de 10 segundos en obtener una respuesta), lo que significa que las conexiones a mi servidor se mantienen abiertas esperando que la API externa responda y ocupando el tiempo del trabajador/ recursos.
Sé que puedo usar el hilo de gunicorn o los trabajadores de gevent para agregar concurrencia, pero parece que no puedo entender la diferencia exacta entre usar gunicorn con trabajadores de gevent y uvicorn (o cualquier otro servidor) con la interfaz asgi.
¿Cuáles serían los criterios para usar uno sobre el otro?
Django todavía no es totalmente compatible con las vistas asíncronas/en espera. ¿Sería mejor si me quedo con los trabajadores de gevent?
Gunicorn tiene un modelo de trabajador previo a la bifurcación
Un modelo de trabajador previo a la bifurcación básicamente significa que un maestro crea bifurcaciones que manejan cada solicitud. Una bifurcación es un proceso *nix completamente separado ( Fuente ).
Uvicorn es un servidor ASGI que ejecuta uvloop
Python async necesita un bucle de eventos para usar sus funciones asíncronas. Y uvloop es una alternativa albucle asyncio . Entonces, si tiene llamadas asíncronas en su código, puede usar uvloop internamente o usar uvicorn como su servidor ASGI. Nota: Todavía tiene un solo bucle de eventos. Puede elegir usar gunicorn y uvicorn para tener varios trabajadores y usar uvloop.
En su aplicación django, tiene sentido usar uvloop internamente (si lo desea) y usar gunicorn como su ASGI.