我尝试将websockets示例项目添加到数据存储项目中,并且websockets正常工作,但是当页面查询数据存储或尝试放置新实体时,我收到502响应。在日志中,它在服务工作者上显示严重错误。如果我删除了websocket代码,则数据存储区代码将按预期工作。我唯一看到的区别是应用示例的入口点略有不同
websocket示例使用
entrypoint: gunicorn -b :$PORT -k flask_sockets.worker main:app
数据存储区示例使用时
entrypoint: gunicorn -b :$PORT main:app
websocket示例https://github.com/GoogleCloudPlatform/python-docs-samples/tree/master/appengine/flexible/websockets
数据存储区示例 https://github.com/GoogleCloudPlatform/python-docs-samples/tree/master/appengine/flexible/datastore
答案 0 :(得分:1)
作为安德鲁回答的补充,您可以扩展gunicorn worker类以运行gRPC应用程序。
# gevent_grpc_worker.py
from gunicorn.workers.ggevent import GeventWorker
from grpc.experimental import gevent
class GeventGrpcWorker(GeventWorker):
def patch(self):
super(GeventGrpcWorker, self).patch()
gevent.init_gevent()
self.log.info('patched grpc')
# config.py for gunicorn
import multiprocessing
from gevent_grpc_worker import GeventGrpcWorker
# http://docs.gunicorn.org/en/stable/design.html#how-many-workers
workers = multiprocessing.cpu_count() * 2 + 1
worker_connections = 10000
# Use an asynchronous worker as most of the work is waiting for websites to load
worker_class = '.'.join([GeventGrpcWorker.__module__,
GeventGrpcWorker.__name__])
timeout = 30
然后通过以下方式启动托管应用程序:
gunicorn -c config.py app:app
答案 1 :(得分:0)
正如您所说,flask_socket.worker似乎有问题,我已经对其进行了测试,但不适用于数据存储区客户端。
我已经尝试过使用{letter worker}与Flask-SocketIO framework一起使用,并且数据存储区查询工作正常。
entrypoint: gunicorn -b :$PORT --worker-class eventlet -w 1 main:app
此外,您还需要在requirements.txt文件eventlet==0.24.1
其缺点是,它破坏了与websocket代码的兼容性,因此您需要重写此部分。请记住,代码示例仅打算在几行中显示如何使用Google Cloud产品并复制粘贴它们,而无需修改app.yaml中不需要的配置。
答案 2 :(得分:0)
问题似乎是GRPC(Cloud Datastore客户端的默认传输机制)与gevent不兼容。除了使用其他websockets框架之外,您还可以使用以下代码通过激活grpc的gevent兼容性补丁来解决此问题:
import grpc.experimental.gevent as grpc_gevent
grpc_gevent.init_gevent()