I'm new to Render , and I make a simple flask web socket
I use these modules: ,flask_socketio ,flask ,gunicorn (to run my script on Render host)
Here is my code for server side:
from flask import Flask
from flask_socketio import SocketIO , emit
app = Flask("application")
socket = SocketIO(app)
@app.route("/")
def home():
return "This is the server side !!"
@socket.on("connect")
def cl_con():
print("A new client connected !!")
@socket.on("disconnect")
def cl_dis():
print("A client disconnected !!")
@socket.on("message")
def message(data):
emit("message",data)
if __name__ == "__main__":
socket.run(app)
and my client side :
import socketio as io
import threading as th
name = ""
while (name == ""):
name = input("Your name :")
def message():
while True:
msg = input()
if (msg == "exit"):
client.disconnect()
print("Disconnected !!")
exit(0)
else:
client.emit("message",f"{name}:{msg}")
client = io.Client()
client.connect("https://my_domain_name.onrender.com")
client.emit("message",f"{name} join this chat !!")
t = th.Thread(target=message)
t.daemon = True
t.start()
@client.on("message")
def msg(data):
print(data)
client.wait()
I'm trying to connect to web socket by my client code which run on my computer , it works , but the problem is this:
1- after 10 second server side give me this error , and it continue showing this error every 5 second :
**[2025-03-07 09:05:06 +0000] [74] [CRITICAL] WORKER TIMEOUT (pid:87)
[2025-03-07 09:05:06 +0000] [87] [ERROR] Error handling request /socket.io/?transport=websocket&EIO=4&sid=E6-m_FkHPBxWcm5MAAAA&t=1741338267.3122072
Traceback (most recent call last):
File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/workers/sync.py", line 134, in handle
self.handle_request(listener, req, client, addr)
File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/workers/sync.py", line 177, in handle_request
respiter = self.wsgi(environ, resp.start_response)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/render/project/src/.venv/lib/python3.11/site-packages/flask/app.py", line 1536, in __call__
return self.wsgi_app(environ, start_response)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/render/project/src/.venv/lib/python3.11/site-packages/flask_socketio/__init__.py", line 42, in __call__
return super().__call__(environ, start_response)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/render/project/src/.venv/lib/python3.11/site-packages/engineio/middleware.py", line 63, in __call__
return self.engineio_app.handle_request(environ, start_response)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/render/project/src/.venv/lib/python3.11/site-packages/socketio/server.py", line 434, in handle_request
return self.eio.handle_request(environ, start_response)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/render/project/src/.venv/lib/python3.11/site-packages/engineio/server.py", line 286, in handle_request
packets = socket.handle_get_request(
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/render/project/src/.venv/lib/python3.11/site-packages/engineio/socket.py", line 92, in handle_get_request
return getattr(self, '_upgrade_' + transport)(environ,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/render/project/src/.venv/lib/python3.11/site-packages/engineio/socket.py", line 151, in _upgrade_websocket
return ws(environ, start_response)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/render/project/src/.venv/lib/python3.11/site-packages/engineio/async_drivers/_websocket_wsgi.py", line 15, in __call__
ret = self.app(self)
^^^^^^^^^^^^^^
File "/opt/render/project/src/.venv/lib/python3.11/site-packages/engineio/socket.py", line 225, in _websocket_handler
p = websocket_wait()
^^^^^^^^^^^^^^^^
File "/opt/render/project/src/.venv/lib/python3.11/site-packages/engineio/socket.py", line 156, in websocket_wait
data = ws.wait()
^^^^^^^^^
File "/opt/render/project/src/.venv/lib/python3.11/site-packages/engineio/async_drivers/_websocket_wsgi.py", line 32, in wait
return self.ws.receive()
^^^^^^^^^^^^^^^^^
File "/opt/render/project/src/.venv/lib/python3.11/site-packages/simple_websocket/ws.py", line 96, in receive
if not self.event.wait(timeout=timeout):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/threading.py", line 629, in wait
signaled = self._cond.wait(timeout)
^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/threading.py", line 327, in wait
waiter.acquire()
File "/opt/render/project/src/.venv/lib/python3.11/site-packages/gunicorn/workers/base.py", line 204, in handle_abort
sys.exit(1)
SystemExit: 1**
2-when I try to connect to server by two clients , the second client get timeout error !!
any help will appreciated
The timeout with the second client is likely due to the fact that the default synchronous worker can only handle one request at a time. Switching to an asynchronous worker will allow multiple concurrent connections without timing out.
Install eventlet:
pip install eventlet
Modify your Gunicorn command
gunicorn -k eventlet -w 1 your_project:app
Specify async mode in the script:
socket = SocketIO(app, async_mode='eventlet')