IO сокета Flask с Gunicorn, Мониторинг всех существующих Greenlets, из-за WORKER_TIME_OUT - PullRequest
0 голосов
/ 29 мая 2018

Итак, у меня приложение IO для сокета Flask запускается с Gunicorn с рабочим классом: geventwebsocket.gunicorn.workers.GeventWebSocketWorker и с 1 рабочим.И я обнаружил, что в конкретном случае я получаю [критический] WORKER_TIME_OUT и API умирает (возможно, есть другой случай).Я смог воспроизвести проблему, выполнив это:

 def test_get_all(self):
     pool = ThreadPool(3)
     entity_route = [self.API_ROUTE, self.API_ROUTE, self.API_ROUTE]
     pool.map(self.get_entity, entity_route)

 def get_entity(self, route):
      rest_client.post(route, json={
        "email": 'DEFAULT_USER_EMAIL',
        "password": DEFAULT_USER_PASSWORD
       }, status_code=200).json()

Так что я вызываю API_ROUTE 3 раза параллельно.Внутри контроллера API_ROUTE я выполняю вызов функции, которая обновляет поле в объекте в базе данных PSQL и в документе в экземпляре Elastic Search.В этот момент API завис, и после 30-секундного тайм-аута по умолчанию умирает.Если я прокомментирую вызов ES или PSQL.Это не проблема.Я пытаюсь использовать eventlet рабочего класса, и он исправляет это, но затем другой маршрут не удался, потому что кажется, что ответы перепутаны.Так что я не уверен, какой рабочий класс использовать, потому что мне нужна функциональность веб-сокета.

Я также пытаюсь использовать блокировку вокруг функции, которая вызывает Elastic Search и PSQL.Но все равно не получится.Примерно так:

from gevent.threading import Lock
lock = Lock()
self.lock.acquire()
entity.update(**data)
self.lock.release()

Если бы кто-то мог указать мне, как настроить мониторинг на гринлете с помощью gunicorn, а также объяснить мне, что происходит, это было бы здорово.Кроме того, приложение работает в Docker и Kubernetes (локально Minikube)

Спасибо!

...