Hacktoberfest 2026: những issue maintainer đã đánh dấu cho tháng Mười, đang mở và phù hợp người mới. Xem issue Hacktoberfest

Poor interaction with threads (python 2.7)

Đang mở
#43 3 bình luận 1 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

Đánh giá

Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức phù hợp với người mới
28/100
Loại issue
Lỗi
Độ rõ ràng
Cần làm rõ
Mức độ hoạt động
Đình trệ
Công nghệ
graphql, python
Lĩnh vực
api, backend

Hướng nghiên cứu

Bắt đầu với query.txt đính kèm và entry point GraphQLView.get_context được hiển thị trong ví dụ, sau đó truy vết dummy_middleware, các resolver lồng nhau, promise.async_instance và Flask g qua các request đồng thời. Tái hiện lỗi bằng ví dụ Python 2.7 được cung cấp và xác định nơi execution chuyển thread. Được xem là hoàn tất khi đã hiểu interaction và thống nhất được hướng khắc phục để duy trì context cục bộ của request.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

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]))
Ngôn ngữ chính
Python
Star
1.3k
Fork
139
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Hướng dẫn đóng góp

Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của graphql-python/flask-graphql

Tất cả issue của graphql-python/flask-graphql

Issue tương tự

Thêm issue về Python

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.