如果grpc服务器与treaded Flask应用程序一起运行,grpc服务器将立即退出

2024-04-28 19:27:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在一个应用程序和容器中运行flaskrestapi和grpcapi,由于某些原因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服务器引导如下所示:

^{pr2}$

由于我的目标是使gRPC和Flask共存,我将gRPC引导添加到应用程序入口点,如下所示:

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

我预计gRPC将启动一个线程并无限期地驻留在后台,而Flask将执行标准的blocking werkzeug引导,并将驻留在前台。所有这些都在开始时发生,但是在Flask start之后的第二秒,gRPC队列CompletionQueue接收到一个SHUTDOWN事件,服务器退出。在

{cyn>我不知道这到底是怎么回事,因为我不能深入了解它的实现。在

gRPC服务器和Flask应用程序分别正常运行,其余代码保持不变。在

如何使这两个事件循环共存?在


Tags: name服务器app应用程序flaskdata标准get
1条回答
网友
1楼 · 发布于 2024-04-28 19:27:54

那么,server变量将在start_server函数完成后被垃圾回收。这就是为什么gRPC服务器似乎立即关闭了。要解决此问题,可以使用全局变量来存储服务器对象。在

另外,如果您认为这种API设计不理想,可以在GitHub repohttps://github.com/grpc/grpc上提交一个问题。在

相关问题 更多 >