Poor interaction with threads (python 2.7)
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 28/100
Piste de recherche
Commencez par le fichier query.txt joint et le point d’entrée GraphQLView.get_context montré dans l’exemple, puis suivez dummy_middleware, les resolvers imbriqués, promise.async_instance et Flask g au cours de requêtes concurrentes. Reproduisez l’échec avec l’exemple Python 2.7 fourni et déterminez à quel endroit l’exécution change de thread. Le travail est considéré comme terminé lorsque l’interaction est comprise et qu’une direction corrective faisant consensus est définie pour préserver le contexte local à la requête.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
the interaction between this library, graphql-core, and promise appears to allow execution to hop threads especially (only?) when using a middleware and nested resolvers. this is inconsistent with flasks threading model and the ability to access the request/g thread locals
with the attached (very contrived) example, when submitting the query with concurrent requests the requests frequently fail because the key created in get_context doesn't exist on the threadlocal flask.g object in the resolvers. This happens when a thread accesses the promise.async_instance which isn't thread local, and resolves a promise that was created on a different thread.
query.txt
from flask import Flask
from flask_graphql import GraphQLView
app = Flask(__name__)
import graphene
import threading
import time
from flask import g
def get_user(info):
return g.get(info.context['key'])
class User(graphene.ObjectType):
id = graphene.ID()
name = graphene.String()
friend = graphene.Field(lambda: User)
age = graphene.Int()
apple = graphene.String()
@classmethod
def resolve_friend(cls, root, info):
time.sleep(.1)
x = get_user(info)
return User(id=id(root), name=':'.join([x.name, threading.current_thread().name]))
@classmethod
def resolve_age(cls, root, info):
time.sleep(.1)
return 5
@classmethod
def resolve_apple(cls, root, info):
time.sleep(.1)
return "Apple"
class Query(graphene.ObjectType):
me = graphene.Field(User)
def resolve_me(self, info):
time.sleep(.1)
return get_user(info)
schema = graphene.Schema(query=Query)
ahh = {}
def dummy_middleware(next, root, info, **args):
return_value = next(root, info, **args)
return return_value
import random
random.seed()
class TestQLView(GraphQLView):
def get_context(self, request):
# set a random key in g to be used by resolvers
key = str(random.randint(0,50))
name = threading.current_thread().name
user = User(id=key, name=name)
setattr(g, key, user)
return {
'key': key
}
app.add_url_rule('/graphql', view_func=TestQLView.as_view('graphql', schema=schema, graphiql=True, middleware=[dummy_middleware]))
- Langage dominant
- Python
- Étoiles
- 1.3k
- Forks
- 138
- 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
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de graphql-python/flask-graphql
-
Difficulté 4/5 3-5 jours Accessibilité débutants 25/100
graphql-python/flask-graphql#92 · 2 commentaires ·
-
Difficulté 4/5 3-5 jours Accessibilité débutants 25/100
-
which graphiql version is using?Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 35/100
graphql-python/flask-graphql#85 · 2 commentaires · 1 réaction ·
-
CSRF Exemption?Ouverte
Difficulté 3/5 1-2 jours Accessibilité débutants 25/100
graphql-python/flask-graphql#84 · 1 commentaire ·
-
Difficulté 4/5 3-5 jours Accessibilité débutants 35/100
graphql-python/flask-graphql#80 · 9 commentaires · 2 réactions ·
Toutes les issues de graphql-python/flask-graphql
Issues similaires
-
needs triage
Difficulté 2/5 1-3 heures Accessibilité débutants 83/100
darnitdevorg/darnit#587 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 67/100
Les mainteneurs répondent en général sous 1 jour
-
accessibility good first issue
Difficulté 1/5 1-3 heures Accessibilité débutants 92/100
Les mainteneurs répondent en général sous 1 jour
-
llm translation
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
Les mainteneurs répondent en général sous 1 jour
-
bug bug-hunt
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
Les mainteneurs répondent en général sous 1 jour