graphql-python / graphql-python/graphql-core-legacy

Some troubles using AsyncioExecutor and gunicorn

Abierto
#283 0 comentarios 0 reacciones 0 asignados Ver en GitHub
Lenguaje dominante
Python
Estrellas
372
Forks
175
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

Hello!

My web app has many api (not only have graphql, but also some rest-api), I am using graphql-core 2.3.2 provided AsyncioExecutor as Executor, and use Gunicorn as WSGI server in production.

The problem is when broswer send some requests concurrently , AsyncioExecutor will raise a error: `RuntimeError: This event loop is already running`.

After my debugging, I found that it was because [AsyncioExecutor.wait_until_finished](https://github.com/graphql-python/graphql-core-legacy/blob/master/graphql/execution/executors/asyncio.py#L67) call `loop.run_until_complete`, then `run_until_complete` will check current loop if closed or running, and raise the error.

A worker of Gunicorn have some threads, those threads shares a event loop, and when a event loop is running, another concurrently request also call `run_until_complete` will raise RuntimeError, so they can't work well concurrently.

My solutions is create a event loop in a single thread, then call `loop.run_forever()`, and rewrite AsyncioExecutor.wait_until_finished as after:

```python
def wait_until_finished(self):
while self.futures:
futures = self.futures
self.futures = []
# self.loop.run_until_complete(wait(futures))
asyncio.run_coroutine_threadsafe(wait(futures), self.loop) # I added this line
```

it works, but this needs to edit the code of graphql-core package, is there a better solution?

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Línea de trabajo

Lee graphql/execution/executors/asyncio.py, especialmente AsyncioExecutor.wait_until_finished y su llamada a loop.run_until_complete. Reproduce solicitudes concurrentes mediante la configuración de Gunicorn descrita en el issue y determina y prueba una solución en la que las solicitudes concurrentes no provoquen RuntimeError: This event loop is already running.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
graphql, python
Área
api, backend
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Estancado
Claridad
Necesita aclaración
Aptitud para principiantes
35/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.