我试图在一个应用程序和容器中运行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服务器引导如下所示:
由于我的目标是使gRPC和Flask共存,我将gRPC引导添加到应用程序入口点,如下所示:
if __name__ == '__main__':
start_server()
flask_app.run()
我预计gRPC将启动一个线程并无限期地驻留在后台,而Flask将执行标准的blocking werkzeug引导,并将驻留在前台。所有这些都在开始时发生,但是在Flask start之后的第二秒,gRPC队列CompletionQueue
接收到一个SHUTDOWN
事件,服务器退出。在
{cyn>我不知道这到底是怎么回事,因为我不能深入了解它的实现。在
gRPC服务器和Flask应用程序分别正常运行,其余代码保持不变。在
如何使这两个事件循环共存?在
那么,
server
变量将在start_server
函数完成后被垃圾回收。这就是为什么gRPC服务器似乎立即关闭了。要解决此问题,可以使用全局变量来存储服务器对象。在另外,如果您认为这种API设计不理想,可以在GitHub repohttps://github.com/grpc/grpc上提交一个问题。在
相关问题 更多 >
编程相关推荐