使用Gunicorn的Flask套接字IO,监视所有现有的Greenlets,因为WORKER_TIME_OUT

时间:2018-05-29 20:23:40

标签: gunicorn gevent flask-socketio

所以我有一个Flask套接字IO应用程序启动与Gunicorn一起使用worker类:​​geventwebsocket.gunicorn.workers.GeventWebSocketWorker和1个worker。并且,我发现在特定情况下,我得到[关键] 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的调用。没有问题。我尝试使用worker类的eventlet并修复它,但是其他路由失败了,因为它似乎反应混乱了。所以我不确定使用什么工作类,因为我需要Web套接字功能。

我还试图在调用Elastic Search和PSQL的函数周围使用锁。但它仍然失败。像这样:

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

如果有人能指出我如何使用gunicorn设置对greenlet的监控,并向我解释发生了什么事情会很棒。此外,该应用程序在docker和kubernetes(minikube local)中运行

谢谢!

0 个答案:

没有答案