gpt4 book ai didi

python - 如果与线程 Flask 应用程序一起运行,grpc 服务器会立即退出

转载 作者:太空宇宙 更新时间:2023-11-03 20:49:36 25 4
gpt4 key购买 nike

我尝试在单个应用程序和容器内运行 Flask REST API 和 gRPC API,但由于某种原因,gRPC 服务器在启动后立即关闭。

所以我有一个简单的 Flask 应用程序,它为几个 REST 端点提供服务。它有两个蓝图和 Bootstrap ,具有相当标准的入口点:

#!/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 接口(interface),并且我希望在同一应用程序和容器内的不同端口上同时运行这两个模块。默认 gRPC 服务器实现使用 futures.ThreadPoolExecutor 并且是非阻塞的,因此我认为它应该能够在 Flask 应用程序执行的后台运行。 gRPC 服务器 Bootstrap 如下所示:

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 bootstrap 并将驻留在前台。所有这些都发生在开始时,但是 Flask 启动后的下一秒,gRPC 队列 CompletionQueue 收到 SHUTDOWN 事件并且服务器退出。

我不知道为什么会发生此事件以及是什么触发了它,并且我无法深入研究 CompletionQueue 因为它是底层的 Cython 实现。

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

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

最佳答案

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

此外,如果您认为此 API 设计不理想,请随时在 GitHub 存储库上提交问题 https://github.com/grpc/grpc .

关于python - 如果与线程 Flask 应用程序一起运行,grpc 服务器会立即退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56358272/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com