Poor interaction with threads (python 2.7)
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 28/100
Línea de trabajo
Comienza con el query.txt adjunto y el punto de entrada GraphQLView.get_context mostrado en el ejemplo; después, sigue dummy_middleware, los resolvers anidados, promise.async_instance y Flask g a través de solicitudes concurrentes. Reproduce el fallo con el ejemplo proporcionado de Python 2.7 y determina dónde cambia de hilo la ejecución. Se considera terminado cuando se comprende la interacción y existe una dirección correctiva acordada para preservar el contexto local de la solicitud.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
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]))
- Lenguaje dominante
- Python
- Estrellas
- 1.3k
- Forks
- 139
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Guía de contribución
No hay ninguna guía de contribución indexada para este repositorio
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de graphql-python/flask-graphql
-
Dificultad 4/5 3-5 días Aptitud para principiantes 25/100
graphql-python/flask-graphql#92 · 2 comentarios ·
-
Dificultad 4/5 3-5 días Aptitud para principiantes 25/100
-
which graphiql version is using? Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 35/100
graphql-python/flask-graphql#85 · 2 comentarios · 1 reacción ·
-
CSRF Exemption? Abierto
Dificultad 3/5 1-2 días Aptitud para principiantes 25/100
graphql-python/flask-graphql#84 · 1 comentario ·
-
Dificultad 4/5 3-5 días Aptitud para principiantes 35/100
graphql-python/flask-graphql#80 · 9 comentarios · 2 reacciones ·
Todos los issues de graphql-python/flask-graphql
Issues similares
-
essnmx good first issue
Dificultad 1/5 Menos de una hora Aptitud para principiantes 95/100
-
[Feature] 奇物选择添加优先级 Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
syfoud/Simulated_Scepter#174 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
Giskard-AI/giskard-oss#2840 · 1 comentario ·
-
A claim comment carrying the issue number is silently declined while the workflow reports success Abiertoarea: repo bug perceived difficulty: 2
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
yeti-platform/yeti#1380 ·