1
votes

Exemple d'application pour App Engine Flexible

J'ai essayé d'ajouter l'exemple de projet websockets au projet de magasin de données et les websockets fonctionnent, mais lorsqu'une page interroge le magasin de données ou essaie de mettre une nouvelle entité, j'obtiens une réponse 502. Dans les journaux, il montre une erreur critique sur le technicien de service. Si je supprime le code websocket, le code de la banque de données fonctionne comme prévu. La seule différence que je peux voir est que les points d'entrée pour les exemples d'application diffèrent légèrement

l'exemple de websocket utilise

entrypoint: gunicorn -b :$PORT main:app

tandis que l'exemple de banque de données utilise

entrypoint: gunicorn -b :$PORT -k flask_sockets.worker main:app

exemple de socket Web https: / /github.com/GoogleCloudPlatform/python-docs-samples/tree/master/appengine/flexible/websockets

exemple de banque de données https://github.com/GoogleCloudPlatform/python- docs-samples / tree / master / appengine / flexible / datastore


0 commentaires

3 Réponses :


0
votes

Comme vous l'avez dit, il semble qu'il y ait un problème avec le flask_socket.worker, je l'ai testé et il ne fonctionne pas avec le client du magasin de données.

J'ai essayé le le framework Flask-SocketIO en utilisant le worker eventlet et les requêtes du magasin de données fonctionnent correctement.

point d'entrée: gunicorn -b: $ PORT - eventlet de classe ouvrier -w 1 main: app

Vous devez également ajouter le module eventlet dans le fichier requirements.txt eventlet==0.24.1

L'inconvénient est que cela rompt la compatibilité avec le code websocket, vous devez donc réécrire cette partie. Gardez à l'esprit que les exemples de code sont simplement destinés à montrer en quelques lignes comment utiliser les produits Google Cloud et à les copier-coller sans modifier la configuration non livrée dans app.yaml n'est pas une bonne idée.


0 commentaires

1
votes

Le problème semble être que GRPC (le mécanisme de transport par défaut du client Cloud Datastore) n'est pas compatible avec gevent. En plus d'utiliser un autre framework Websockets, vous pouvez contourner le problème en activant le correctif de compatibilité gevent de grpc, en utilisant le code suivant:

import grpc.experimental.gevent as grpc_gevent
grpc_gevent.init_gevent()


0 commentaires

2
votes

En complément de la réponse d'Andrew, vous pouvez étendre la classe de travail gunicorn pour exécuter des applications gRPC.

gunicorn -c config.py app:app
# 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

Ensuite, démarrez votre application gérée par: p>

# 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')


0 commentaires