From 692180c6533318753bb83c584d88d7e690b2bc7d Mon Sep 17 00:00:00 2001 From: Fabio Manganiello Date: Sun, 7 May 2023 15:37:58 +0200 Subject: [PATCH] Back to uvicorn workers from eventlet. The eventlet API has way too many dependency issues with gunicorn. Still TODO: Fix or at least mitigate the WSGI workers timeout issue when they handle websocket connections. --- docs/source/conf.py | 1 + platypush/backend/http/__init__.py | 4 ++-- platypush/backend/http/wsgi/__init__.py | 7 +++++++ requirements.txt | 2 +- setup.py | 4 ++-- 5 files changed, 13 insertions(+), 5 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index b4770b9ffd..900c617c30 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -303,6 +303,7 @@ autodoc_mock_imports = [ 'bluetooth_numbers', 'TheengsDecoder', 'simple_websocket', + 'uvicorn', ] sys.path.insert(0, os.path.abspath('../..')) diff --git a/platypush/backend/http/__init__.py b/platypush/backend/http/__init__.py index c57f5a02f3..df9b0b3314 100644 --- a/platypush/backend/http/__init__.py +++ b/platypush/backend/http/__init__.py @@ -252,8 +252,8 @@ class HttpBackend(Backend): kwargs = { 'bind': f'{self.bind_address}:{self.port}', 'workers': (cpu_count() * 2) + 1, - 'worker_class': 'eventlet', - 'timeout': 60, + 'worker_class_str': f'{__package__}.app.UvicornWorker', + 'timeout': 30, } WSGIApplicationWrapper(f'{__package__}.app:application', kwargs).run() diff --git a/platypush/backend/http/wsgi/__init__.py b/platypush/backend/http/wsgi/__init__.py index e304884bab..a2798e05d8 100644 --- a/platypush/backend/http/wsgi/__init__.py +++ b/platypush/backend/http/wsgi/__init__.py @@ -1,4 +1,11 @@ +from typing import Any, Dict + from gunicorn.app.wsgiapp import WSGIApplication +from uvicorn.workers import UvicornWorker as BaseUvicornWorker + + +class UvicornWorker(BaseUvicornWorker): + CONFIG_KWARGS: Dict[str, Any] = {"loop": "auto", "http": "auto", "lifespan": "on"} class WSGIApplicationWrapper(WSGIApplication): diff --git a/requirements.txt b/requirements.txt index b1ead9c9d0..16b74f211f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,7 +5,6 @@ alembic bcrypt croniter -eventlet flask frozendict gunicorn @@ -22,6 +21,7 @@ rsa simple_websocket sqlalchemy tz +uvicorn websocket-client wsproto zeroconf>=0.27.0 diff --git a/setup.py b/setup.py index e83e611434..7f5712ac4f 100755 --- a/setup.py +++ b/setup.py @@ -63,10 +63,9 @@ setup( 'alembic', 'bcrypt', 'croniter', - 'eventlet', 'flask', 'frozendict', - 'gunicorn @ https://github.com/benoitc/gunicorn/tarball/master', + 'gunicorn', 'marshmallow', 'marshmallow_dataclass', 'python-dateutil', @@ -78,6 +77,7 @@ setup( 'simple_websocket', 'sqlalchemy', 'tz', + 'uvicorn', 'websocket-client', 'wheel', 'wsproto',