【发布时间】:2019-10-14 22:19:55
【问题描述】:
我正在尝试在单个应用程序和容器中运行 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 引导程序添加到应用程序入口点,如下所示:
if __name__ == '__main__':
start_server()
flask_app.run()
我希望 gRPC 将启动一个线程并无限期地在后台运行,而 Flask 将执行标准的阻塞 werkzeug 引导程序并在前台运行。所有这一切都发生在开始时,但是在 Flask 启动 gRPC 队列后的下一秒 CompletionQueue 收到 SHUTDOWN 事件并且服务器退出。
我不知道为什么会发生此事件以及触发它的原因,我无法更深入地研究 CompletionQueue,因为它是 Cython 的实现。
单独的 gRPC 服务器和 Flask 应用程序在所有其余代码不变的情况下正常运行。
如何让这两个事件循环共存?
【问题讨论】:
标签: python multithreading flask grpc grpc-python