Есть необходимость в проект на Django 4 добавить Socket.IO для ряда задач.
С помощью пакета
python-socketio я её смог добавить. В качестве сервера используется настройка gunicorn + geventwebsocket.
Проведенные настройки:
# app/config/sockets.py
import socketio
from .settings import REDIS_HOST
from gevent import monkey
monkey.patch_all()
mgr = socketio.RedisManager(REDIS_HOST)
sio = socketio.Server(
async_mode='gevent',
client_manager=mgr,
cors_allowed_origins="*",
logger=True,
engineio_logger=True,
namespaces='*'
)
# app/config/wsgi.py
import os
from gevent import pywsgi
from geventwebsocket.handler import WebSocketHandler
from django.core.wsgi import get_wsgi_application
import socketio
from config.sockets import sio
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
application = get_wsgi_application()
application = socketio.WSGIApp(sio, application)
pywsgi.WSGIServer(('', 8800), application, handler_class=WebSocketHandler).serve_forever()
Запуск производится следующей командой:
gunicorn --reload -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker -w 1 config.wsgi:application --bind 0.0.0.0:8000 --log-level debug
В итоге сокеты работают, а любой запрос по Rest API уходит в бесконечное ожидание. В логах сервиса только это:
[2023-03-14 12:17:48 +0000] [1] [INFO] Starting gunicorn 20.1.0
[2023-03-14 12:17:48 +0000] [1] [DEBUG] Arbiter booted
[2023-03-14 12:17:48 +0000] [1] [INFO] Listening at: http://0.0.0.0:8000 (1)
[2023-03-14 12:17:48 +0000] [1] [INFO] Using worker: geventwebsocket.gunicorn.workers.GeventWebSocketWorker
[2023-03-14 12:17:48 +0000] [24] [INFO] Booting worker with pid: 24
[2023-03-14 12:17:48 +0000] [1] [DEBUG] 1 workers
Server initialized for gevent.
[2023-03-14 12:18:18 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:24)
[2023-03-14 15:18:18 +0300] [24] [INFO] Worker exiting (pid: 24)
[2023-03-14 12:18:18 +0000] [27] [INFO] Booting worker with pid: 27
Server initialized for gevent.
[2023-03-14 12:18:48 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:27)
[2023-03-14 15:18:48 +0300] [27] [INFO] Worker exiting (pid: 27)
[2023-03-14 12:18:49 +0000] [30] [INFO] Booting worker with pid: 30
Server initialized for gevent.
[2023-03-14 12:19:19 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:30)
[2023-03-14 15:19:19 +0300] [30] [INFO] Worker exiting (pid: 30)
[2023-03-14 12:19:19 +0000] [33] [INFO] Booting worker with pid: 33
Server initialized for gevent.
В чем может быть причина? Правильно ли вообще настроил запуск? Или как-то надо разделить запуск веб-сервера для restapi и отдельно для сокетов?