Сервер grpc немедленно завершает работу, если работает вместе с приложением Flask - PullRequest
1 голос
/ 29 мая 2019

Я пытаюсь запустить Flask REST API и gRPC API внутри одного приложения и контейнера, и по какой-то причине сервер gRPC закрывается сразу после запуска.

Итак, у меня есть простое приложение Flask, которое обслуживает несколько конечных точек REST. Он имеет два чертежа и бутстрапа с довольно стандартной точкой входа:

#!/usr/bin/env python
from app import bootstrap

app_name = os.environ.get(C.KEYS.APP_NAME_KEY)
conf_data = bootstrap.get_conf_data(app_name)
flask_app = bootstrap.get_app(app_name, conf_data)
bootstrap.register_blueprints(flask_app)

if __name__ == '__main__':
    flask_app.run()

Я создал отдельный модуль, который реализует простой интерфейс gRPC, и я хочу запускать оба одновременно на разных портах внутри одного и того же приложения и контейнера. Реализация сервера gRPC по умолчанию использует futures.ThreadPoolExecutor и является неблокируемой, поэтому я предполагаю, что она должна работать в фоновом режиме при выполнении приложения Flask. Загрузка сервера gRPC выглядит следующим образом:

import grpc
from concurrent import futures

from svc.auth_grpc import auth_pb2, auth_pb2_grpc


def start_server():
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=1),
                         maximum_concurrent_rpcs=1)
    auth_pb2_grpc.add_AuthServiceServicer_to_server(AuthServiceServicer(),
                                                    server)
    server.add_insecure_port(f'0.0.0.0:9091')
    server.start()

И так как моя цель состоит в том, чтобы заставить gRPC и Flask сосуществовать - я добавляю gRPC bootstrap к точке входа приложения следующим образом:

if __name__ == '__main__':
    start_server()
    flask_app.run()

Я ожидаю, что gRPC запустит поток и будет жить в фоновом режиме бесконечно, в то время как Flask выполнит стандартную блокировку начальной загрузки werkzeug и будет жить на переднем плане. Все это происходит в начале, однако в следующую секунду после запуска Flask очередь gRPC CompletionQueue получает событие SHUTDOWN и сервер завершает работу.

Я не знаю, почему происходит это событие и что его вызывает, и я не могу глубже заглянуть в CompletionQueue, потому что это реализация Cython внизу.

Отдельно сервер gRPC и приложение Flask работают правильно, а весь остальной код остается без изменений.

Как заставить эти два цикла событий сосуществовать?

1 Ответ

0 голосов
/ 04 июня 2019

Что ж, переменная server будет собирать мусор после завершения функции start_server.Вот почему сервер gRPC кажется закрытым сразу.Чтобы решить эту проблему, вы можете использовать глобальную переменную для хранения объекта сервера.

Кроме того, если вы считаете, что этот API-дизайн не идеален, не стесняйтесь подавать вопрос в репозитории GitHub https://github.com/grpc/grpc.

...