Some troubles using AsyncioExecutor and gunicorn

Ouverte
#283 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Évaluation

Difficulté
4/5
Temps estimé
3-5 jours
Accessibilité débutants
35/100
Type d'issue
Bug
Clarté
À clarifier
Activité
À l'abandon
Stack technique
graphql, python
Domaine
api, backend

Piste de recherche

Lisez graphql/execution/executors/asyncio.py, en particulier AsyncioExecutor.wait_until_finished et son appel à loop.run_until_complete. Reproduisez des requêtes concurrentes via la configuration Gunicorn décrite dans l’issue, puis déterminez et testez une solution dans laquelle les requêtes concurrentes ne déclenchent pas RuntimeError: This event loop is already running.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

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 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:

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?

Langage dominant
Python
Étoiles
371
Forks
174
Métriques de merge des PR
Aucune PR mergée en 30 j

Préparer son environnement

Ce projet ne fournit ni conteneur de développement, ni Dockerfile, ni guide de contribution : l'installation est à votre charge. Commencez par son README, et consultez notre guide de la première contribution pour les étapes générales.

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de graphql-python/graphql-core-legacy

Toutes les issues de graphql-python/graphql-core-legacy

Issues similaires

Plus d'issues Python

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.